SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 4715|回复: 4
打印 上一主题 下一主题

你还记得Modify和Update语句吗?

[复制链接]

10

主题

39

帖子

1070

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1070
QQ
跳转到指定楼层
楼主
发表于 2014-4-27 21:31:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
相信大家在平时的数据处理中都经常使用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个变量的数据为例。


  • 使用SET语句,耗时20.61秒;


  • 使用Modify语句,耗时1.58秒;


运行时间从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语句有以下几个区别:

  • 当第二个数据集(update语句中称为transaction data set)中的by变量有多个取值,Merge语句会生成多条观测,而Update语句会重复更新,即后面的值会覆盖前面的值;
  • 当第二个数据集(update语句中称为transaction data set)中有缺失值的时候,Merge语句会将缺失值更新进去,而Update语句默认不会更新,可通过UPDATEMODE选项进行设置;
以上这两个区别通过例子进行说明:
测试数据准备:

  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;
复制代码


结果对比如下,可以看出来区别还是很大的




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

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




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
分享到:  微信微信
收藏收藏2
回复

使用道具 举报

0

主题

6

帖子

72

积分

注册会员

Rank: 2

积分
72
沙发
发表于 2014-4-28 01:30:28 | 只看该作者
谢谢分享!
回复

使用道具 举报

0

主题

7

帖子

131

积分

注册会员

Rank: 2

积分
131
板凳
发表于 2014-4-28 09:29:13 | 只看该作者
哈哈 总结的非常到位 点10086个赞
回复 支持 反对

使用道具 举报

2

主题

18

帖子

441

积分

中级会员

Rank: 3Rank: 3

积分
441
地板
发表于 2014-4-28 10:10:06 | 只看该作者
谢谢分享!
回复

使用道具 举报

3

主题

17

帖子

213

积分

中级会员

Rank: 3Rank: 3

积分
213
5#
发表于 2014-5-12 11:15:24 | 只看该作者
学习了,以前真没想过这么多。。。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2024-11-22 08:02 , Processed in 0.220975 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表