Why More efficient?
Modify语句效率比Set语句高这么多,是因为其运行机制原因。Set语句是将数据读取进来处理后,生成新的数据(即使data语句中的数据和set语句中的数据是相同的,都会生成一份新的是数据,然后覆盖原来的数据);而Modify语句是直接对数据进行修改(data语句的数据和Modify语句的数据必须是相同的),因此不会生成新的数据,所以效率会大大提升。
(注:因为Modify语句是对数据集进行修改,因此若想要对数据集增加新的变量,Modify语句是无法实现的。)
2. Update语句 Update语句,就是对数据进行匹配更新。其功能与加了by语句的Merge基本类似,但又有区别。Update语句必须要有2个数据集,称之为master data set, transaction data set. 而Merge语句支持2个以上的数据集进行匹配。当对两个数据做匹配时,Merge语句与Update语句有以下几个区别:
当第二个数据集(update语句中称为transaction data set)中的by变量有多个取值,Merge语句会生成多条观测,而Update语句会重复更新,即后面的值会覆盖前面的值;
当第二个数据集(update语句中称为transaction data set)中有缺失值的时候,Merge语句会将缺失值更新进去,而Update语句默认不会更新,可通过UPDATEMODE选项进行设置;
以上这两个区别通过例子进行说明:
测试数据准备:
data health;
input ID WEIGHT;
cards;
1114 125
1441 145
1994 165
1750 189
2304 170
;
run;
data fitness;
input ID WEIGHT;
cards;
1114 119
1114 135
2304 146
1994 .
;
run;
复制代码
数据按照BY变量排序,Update语句和Merge语句都需要;(或者对BY变量建立索引)
proc sort data=health;
by id;
run;
proc sort data=fitness;
by id;
run;
复制代码
数据匹配
data health2;
update health fitness;
by id ;
run;
data health3;
merge health fitness;
by id;
run;
复制代码
结果对比如下,可以看出来区别还是很大的
总结:SET语句和MERGE语句,相比Modify语句和Update语句功能更全面,但全面不一定意味到处用都好。其实像上面的这种匹配,Modify语句也可以实现。但Modify语句不能生成新的数据,而且不能新增加新的变量,但Modify语句的好处在于不需要事先对数据按照BY变量进行排序,因为其采用的是dynamic where statement,这就显示出Modify语句的强大了,要对几千万条数据进行排序,那是需要花很多资源的。大家可以试试用Modify语句做类似的匹配更新测试。