SAS中文论坛

标题: 你还记得Modify和Update语句吗? [打印本页]

作者: slash    时间: 2014-4-27 21:31
标题: 你还记得Modify和Update语句吗?
相信大家在平时的数据处理中都经常使用SET语句和MERGE语句,可曾使用过MODIFY语句和UPDATE语句?相信很少人使用,或许已经忘记它们了。今天通过几个例子来说明MODIFY和UPDATE语句的重要性,不要在对数据做修改时就想起SET语句,在做数据匹配时就想起MERGE语句,也要想起MODIFY和UPDATE语句。

1. 使用Modify语句提高程序运行效率
很多时候我们需要对某个数据集里面的某个变量的值进行更新,这时候会毫不犹豫的写下如下所示代码:
  1. data test;
  2. set test;
  3. x=x*10;
  4. run;
复制代码


此段程序并无错误,但从效率上讲就比较低了。如果用Modify语句,效率就可提升好几倍。
  1. data test;
  2. modify test;
  3. x=x*10;
  4. run;
复制代码


为了使大家能够更直观的感受到效率的提升,我特地做了一次测试,以935,653条观测,40个变量的数据为例。




运行时间从20.61秒减少至1.58秒,这效率提升了多少倍?90w左右的数据就能提升这么高,上百万,上千万,上亿呢?
因此保证程序正确运行是远远不够的,追求更高效率才是最有用的。


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语句有以下几个区别:

以上这两个区别通过例子进行说明:
测试数据准备:

  1. data health;
  2.    input ID WEIGHT;
  3.    cards;
  4. 1114 125
  5. 1441 145
  6. 1994 165
  7. 1750 189
  8. 2304 170
  9. ;
  10. run;
  11. data fitness;
  12. input ID WEIGHT;
  13.    cards;
  14. 1114 119
  15. 1114 135
  16. 2304 146
  17. 1994  .
  18. ;
  19. run;
复制代码


数据按照BY变量排序,Update语句和Merge语句都需要;(或者对BY变量建立索引)
  1. proc sort data=health;
  2.    by id;
  3. run;
  4. proc sort data=fitness;
  5.    by id;
  6. run;
复制代码


数据匹配
  1. data health2;
  2.    update health fitness;
  3.    by id ;
  4. run;
  5. data health3;
  6. merge health fitness;
  7. by id;
  8. run;
复制代码


结果对比如下,可以看出来区别还是很大的
[attach]67[/attach]



总结:SET语句和MERGE语句,相比Modify语句和Update语句功能更全面,但全面不一定意味到处用都好。其实像上面的这种匹配,Modify语句也可以实现。但Modify语句不能生成新的数据,而且不能新增加新的变量,Modify语句的好处在于不需要事先对数据按照BY变量进行排序,因为其采用的是dynamic where statement,这就显示出Modify语句的强大了,要对几千万条数据进行排序,那是需要花很多资源的。大家可以试试用Modify语句做类似的匹配更新测试。

以上就是今天的内容,希望大家能有所收获!!!





作者: stata    时间: 2014-4-28 01:30
谢谢分享!
作者: 愤怒的老鸟    时间: 2014-4-28 09:29
哈哈 总结的非常到位 点10086个赞
作者: hopewell    时间: 2014-4-28 10:10
谢谢分享!
作者: chenli9045    时间: 2014-5-12 11:15
学习了,以前真没想过这么多。。。




欢迎光临 SAS中文论坛 (https://mysas.net/forum/) Powered by Discuz! X3.2