函数和语句,顺带讲下PDV

新学SAS的同学,可能对SAS中“函数”和“语句”分不清楚,感觉好像都一样,但是写多了,就知道哪些我们常用的功能是函数,哪些是语句,比如keep,drop,where等是语句,strip,compress,substr是函数。

还有一种方法就是打开SASHELP文档,查找你要找的功能。比如查找strip,那么就会显示“function”关键字。

查找keep,会显示"statement"关键字

今天就来介绍SAS语句中初学要注意的地方,记得当初学语句的时候,总是不清楚语句在data步中的位置导致SAS总是报错。下面介绍的语句都是实际中非常常用的。

一:keep语句,保留变量。

如果一个数据集有几十个变量,而你只需要某几个变量拿去分析,这时候就可以用上keep语句。

data test;

set sashelp.classfit;

keep name sex age;    /*输出数据集值保留这3个变量,变量之间没逗号*/

run;

keep放在输入数据集的后面

data test;

    set sashelp.classfit(keep=name sex age);  /*多了=号*/

run;

得到的结果跟上面一样,可能你觉得这两个方法是一样的,因为结果一致。但是其实它们还是有很大区别的,SAS执行过程不一样。

这就涉及到SAS的PDV机制,一时半会也讲不清楚(其实是我了解一点,但我讲不出来,嘿嘿嘿)。建议大家去了解一下,对SAS有一个更清晰的了解。

二:drop语句,删除变量。

data test;

set sashelp.classfit;

drop name sex age;

run;

data test;

    set sashelp.classfit(drop=name sex age);

run;

drop和keep是兄弟,写法一样,至于用哪个,自己根据具体情况判断选择,但是要是一个数据集中有几十个变量,而你只需要几个关键变量,你写drop不写死掉,这时候肯定用keep啊!

三:where语句,筛选条件语句。

where翻译过来就是“在哪里”,就是告诉SAS找出哪些符合条件的观测(注意是观测,不是变量,keep,drop针对的就是变量)

data test;

set sashelp.classfit;

where sex="F";  /*筛选出性别为女的观测,这时候where就相当于if*/

       /*if sex="F";*/

run;

但是如果where放在输入数据集的后面,注意这时候就有两个括号了,而不是像keep那样只有一个括号,应该是把(sex="F")看做一个整体!

data test;

    set sashelp.classfit(where=(sex="F"));

run;

四:rename语句,重命名,将数据集中的变量名重命名为其他名称。

data test;

    set sashelp.classfit;

     rename name=id age=agee;  /*将name重命名为id,age重命名为agee*/

run;

放在输入数据集后跟where一样有两个括号

data test;

    set sashelp.classfit(rename=(name=id age=agee));

run;

就先写这四个语句,其他语句大家可以上网搜。可能只有我刚开始学的时候括号分不清楚吧。初学SAS时一直报错就是这些细节的地方出错。

为什么我讲语句放在data步中间和放在数据集后面不一样?不行,我还是要讲一下。

(注:图中蓝色框内的文字是我自己臆想出来的,尤其是那个SAS处理器存不存在我真不确定,或者不叫这个名字)

外部数据,也就是你通过set或者proc import输入的数据集,在本章中就是classfit数据集。

SAS处理器:我们将它看做一个池子。

输出数据集:就是最终SAS展现给我们肉眼看到的数据集,在本章中就是test数据集。

首先我们在读入数据集的时候(以keep语句为例),如果你是把keep语句放在data步中间,也就是sas在读入classfit这个数据集的时候,把10个变量都读取到SAS自身这个池子里了,之后你再在这个池子中对数据进行处理,至于你会不会对10个变量都进行处理,SAS不管!SAS只管把10个变量读取进来就完成任务了。

但是如果你把keep语句放在输入数据集的后面 set sashelp.classfit(keep=name sex age);    相当于SAS只把 name sex age这3个变量放到池子里,如果你一时兴起还想对height,weight变量进行处理。不好意思,SAS找不到这两个变量。

data test;

set sashelp.classfit(keep=name sex age);

height2=2*height;

run;

所以虽然文章开头举得例子输出结果都一样,但是SAS却偷偷进行不一样的处理。

如果我们把 keep=name sex age放在输出数据集test后面,按照上面的解释,你知道SAS进行了哪些处理吗?

data test(keep=name sex age height2);

set sashelp.classfit;

height2=2*height;

run;

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容