新学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;