数据集操作永远是逃不掉的问题,最简单的就是两个数据集的合并——当然不是简简单单的行列添加,按照某一主键或者某些主键合并才是最常用的。在SAS中,要熟悉的就是SET这个声明,可以用改变数据集等等。
生成新变量
这里一个比较简单的例子,就是有一个现成的数据集,我们想增加一个变量。
这样的结果就是增加了一个新的变量
行合并
这里比较类似于R里面的rbind()函数,就是直接在尾部附上后面的数据。当SET指定了两个或多个数据集的时候,可以进行这样的操作。距离如下:
然后结果输出为:
这里很容易看出,对于第一个数据集没有的变量LOT,会自动添加缺失值。
SET还可以进一步结合BY对数据排序:
这样返回的结果就是按照PassNumber排序的了:
SAS一对一合并数据集
类似于SQL的join和R的merge,SAS也可以合并数据集。先从最简单的一对一合并说起:
这样就可以得到按照CodeNum来合并这两个数据集了,返回结果为:
当然一对多也是可行的。
原数据为:
然后代码为:
最后得到的结果就是:
有的时候我们还想把一些统计量也合并进来,比如PROC MEANS得到的那些,这样自然也是不怎么麻烦的。
这里用到了OUTPUT输出统计结果到SAS数据集,这样最后结果就是:
还有一些特定的情况,可以不用MERGE而是UPDATE,这个就得稍稍小心一点了...
基本就是把patientmaster这个数据集用transactions里面有的数据覆盖掉相应的记录。
SAS里面拆分数据
在读入数据的时候,SAS还可以自动按照某些条件把其拆分为两个数据集,这里需要调用OUTPUT声明。
得到的就是两个数据集(虽然我们读入的只有一个...你也可以理解为生成了两个原数据集的子集):
这里就类似于R里面的split()函数了。
还有一些数据格式比较不稳定,比如一行多条记录:
这个时候就可以利用OUTPUT的操作,来逐行读取并输出:
最后得到的数据就相当规范了(我在想为啥SAS可以有这么多奇葩的数据输入...真折磨人啊):
SAS里面变量选取等参数
其实DATA里面的参数还是蛮多的,除了以前提到过的KEEP,DROP,还有可以重命名的RENAME等。还有一个比较有用的可能就是IN了:
这样可以增加一个新的变量Recent,来记录某条记录是否被合并。
WHERE的用法也可以稍稍赘述一下:
这样得到的结果为:
SAS中数据的转置:TRANSPOSE
数据的转置有时候也是逃不掉的。这里就有些类似于R里面的reshape()函数了,但是肯定没有reshape2里面的melt and cast强大...我一度觉得reshape2的用法很麻烦,后来才发现原来这东西真的强大到一定程度了...
结果为:
SAS里面自带的变量
SAS里面有些默认自带的变量,有时候用起来还是蛮方便的,类似于R会自带一个row.names这种变量。
比如_N_就会加上行号(当然有时候也不是,呃,准确的说应该是SAS执行的循环顺序,说了SAS是一行行操作数据的嘛):
这样得到的结果就是排序后的次序了:
类似的变量还有FIRST.variable和LST.variable,这里由于我们用到了 FIRST.AgeGroup,所以第二次输出的时候只有第一个AGE GROUP的结果。