前几天有个朋友建议我写点关于SAS的Proc SQL,今天我就稍微整理了一下几个比较常用的知识点。SQL的全称是Structured Query Language,结构化查询语言。在关系型数据库的计算机查询语言里面,SQL算是鼻祖了。SAS作为一个大而全的统计软件,自然不会漏掉这块,将其整合到了一个procedure里。
接下来正式开始。说明白一个道理最好的方法还是举例,先准备两个数据集:
Dataset 1: X1(3个变量,6条记录)
Dataset 2: X2(同样是3个变量,6条记录)
Example 1: Cartesian Product Join
这是我最喜欢SQL的一点,生成笛卡尔乘积数据集D(共6*6=36条记录):
生成这一数据集后,能做的事就很多了,主要在条件筛选方面,比如确定Analysis Window的时候。下面的程序给出的是在treatment相同且任意visit时,x1
但在实际操作过程中,这两步通常是合二为一的,因为两个一万条记录的datasets的笛卡尔乘积数据集就是一亿条,会严重消耗系统资源,所以一般程序如下:
SAS的Data Step应该也能实现一样的功能,但我没试过,有兴趣的小伙伴可以尝试下。
Example 2: Empty Dataset:
方法1: Proc SQL
方法2:Data Step
两种方法结果都如下(一个数值型变量,两个字符型变量,记录数为零),语法难易方面,区别不明显。
Example 3: Union
方法1:Proc SQL
结果如下:
有意思的地方是两个数据集合起来了,但变量名是第一个数据集的。
方法2:Data Step
结果如下:
跟Proc SQL相比,差别就不言而喻了。
Example 4:Inner Join
方法1:Proc SQL
结果如下:
方法2:Data Step
结果如下:
两种方法结果一致(虽然Proc SQL有冗余的变量trtn1 trtn2,avisitn1 avisitn2),但语法方面,Proc SQL似乎略胜一筹。
Example 5:Outer Join - Left Join
方法1:Proc SQL
结果如下:
方法2: Data Step
结果如下:
Example 6: Outer Join - Right Join
方法1:Proc SQL
结果如下:
方法2:Data Step
结果如下:
仔细体会一下例4,例5和例6,就能明白在inner join, left join,和right join方面,Proc SQL和Data Step的异同点。
Example 7:Macro Variable
上面的程序时从数据集X1读取所有变量名,然后输出到一个宏变量names:
names = trtn1 avisitn1 x1
这段程序稍微修改了一个地方,输出的宏变量值是以逗号分隔的:
names = trtn1, avisitn1, x1
Example 8:Summary Function
上面这段程序的功能跟Proc Means和Proc Univariate很类似,都是给出某个随机变量的descriptive statistics。结果如下:
这里提一下,Proc SQL在做浮点运算时(例如计算mean, median, std),精度方面跟Proc Means和Proc Univariate会有一些很微小的差异。精度似乎是差一些,小伙伴们可以自己验证一下。
总结
Proc SQL的功能远不止今天提到的这些,我所知道的也只是一些皮毛。我见过有些高手把Proc SQL用得是活灵活现,虎虎生风
好啦,今天就说到这。祝各位小伙伴晚安
领取专属 10元无门槛券
私享最新 技术干货