楼主: playmore
2834 5

请问一个赋值表达式里有缺失值的问题 [推广有奖]

已卖:1645份资源

学科带头人

2%

还不是VIP/贵宾

-

TA的文库  其他...

R相关

经济学相关

金融工程

威望
1
论坛币
16356 个
通用积分
8.6697
学术水平
372 点
热心指数
394 点
信用等级
341 点
经验
15297 点
帖子
1194
精华
1
在线时间
1332 小时
注册时间
2007-1-11
最后登录
2025-12-1

初级学术勋章 初级热心勋章 中级热心勋章

楼主
playmore 发表于 2013-6-26 08:57:34 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
我这里有一个指标,设为X,需要用A、B、C和D三个变量的加权平均来得到
其中,如果相邻的两个变量之一是缺失的,则用非缺失的那个代替
且靠前的指标有效性较高,如果缺失值两边都有值,则用前面的值代替
举个例子,如果B和D缺失,则B用A代替,D用C代替
如果A和B缺失,则都用C代替

如果用穷举,会有2^4种情况
如果用array,从前向后来一遍,再从后向前来一遍,把缺失值补齐好像也可以,但必须生成一个新表或覆盖原表
我想有没有一个只在计算指标的过程中一次性的完成这个任务的方法
知道这版里高手多,特来问一下,谢谢!

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:表达式 缺失值 array Ray ARR 表达式

playmore邀请您访问ChinaTeX论坛!!!进入ChinaTeX论坛

沙发
moyunzheng 发表于 2013-6-26 10:01:48
如下:
先更新c,在更新b,最后更新a和d(a,d先后顺序无所谓)
  1. data work.test ;
  2. input a b c d;
  3. cards;
  4. 1 2 3 4
  5. 1 2 3 .
  6. 1 2 . 4
  7. 1 2 . .
  8. 1 . 3 4
  9. 1 . 3 .
  10. 1 . . 4
  11. 1 . . .
  12. . 2 3 4
  13. . 2 3 .
  14. . 2 . 4
  15. . 2 . .
  16. . . 3 4
  17. . . 3 .
  18. . . . 4
  19. . . . .
  20. ;
  21. run;
  22. proc sql noprint;
  23. update work.test
  24.         set
  25.                 c=COALESCE(c,b,d,a),
  26.                 b=COALESCE(b,a,c,d),
  27.                 a=COALESCE(a,b,c,d),
  28.                 d=COALESCE(d,c,b,a)
  29.         where 0<nmiss(a,b,c,d)<4
  30. ;
  31. quit;
复制代码
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
playmore + 1 + 1 + 1 观点有启发

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

藤椅
playmore 发表于 2013-6-26 13:14:33
moyunzheng 发表于 2013-6-26 10:01
如下:
先更新c,在更新b,最后更新a和d(a,d先后顺序无所谓)
嗯,不错,才想到有COALESCE这个函数,过去见到过但从未用过
playmore邀请您访问ChinaTeX论坛!!!进入ChinaTeX论坛

板凳
playmore 发表于 2013-6-26 13:16:55
moyunzheng 发表于 2013-6-26 10:01
如下:
先更新c,在更新b,最后更新a和d(a,d先后顺序无所谓)
另外再问下在proc sql里的update和data步里的update有什么区别?
效率上有差异吗?谢谢·!
playmore邀请您访问ChinaTeX论坛!!!进入ChinaTeX论坛

报纸
moyunzheng 发表于 2013-6-26 15:11:55
playmore 发表于 2013-6-26 13:16
另外再问下在proc sql里的update和data步里的update有什么区别?
效率上有差异吗?谢谢·!
data步的update语句需要两个数据集,用第二个数据集的数据更新第一个数据集,本例子并不适用。下面的例子可以说明。同时,update\set\merge语句的实质是读取数据生成新的临时数据,处理完整无错误后将临时数据更名。也就是所,创建的新的数据集的,效率肯定比不创建新数据集的proc sql;update低。
上面代码中,可以使用data 步的modify替代,同样是不创建新的数据集。至于有没有优化我就不太了解了。我猜想,SQL中应该有优化吧,就是只读入update语句中用到的变量。data modify中是读入所有变量进入内存的(put _all_可以证明),所以可能SQL的效率应该比data步高,但下面程序中证明想法是错的。
  1. data test1 test2;
  2. a=1;b=2;
  3. run;

  4. data test1;
  5. modify test1;
  6. a=3;a=3;b=5;c=2;
  7. put _all_;
  8. run;

  9. data test2;
  10. update test2;
  11. a=3;b=5;c=2;
  12. run;

  13. data test3 test4;
  14. length dd $ 32;
  15. do i=1 to 10000000;
  16.         x=.;y=.;z=.;dd="haha";
  17.         output;
  18.         end;
  19. run;

  20. proc sql noprint;
  21. update test3
  22.         set x=1;
  23. quit;
  24. data test4;
  25. modify test4;
  26. x=1;
  27. run;
复制代码
已有 2 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
Imasasor + 100 + 60 + 4 + 4 + 4 鼓励积极发帖讨论
boe + 1 + 1 + 1 赞一个!!!

总评分: 经验 + 100  论坛币 + 60  学术水平 + 5  热心指数 + 5  信用等级 + 5   查看全部评分

地板
playmore 发表于 2013-6-26 16:59:17
moyunzheng 发表于 2013-6-26 15:11
data步的update语句需要两个数据集,用第二个数据集的数据更新第一个数据集,本例子并不适用。下面的例子 ...
我刚试了下你的代码。发现用Data步和Proc sql更新数据集的CPU时间和实际时间都差不多。

我认为Data步应该是每次读入一条观测进内存的,全部的变量都读进去了。PDV这东西我就没怎么搞明白过,希望明白人指教。

而Proc Sql不确定是什么算法,有无索引,但速度反正不快。过去我用ODBC在SAS中处理表,现在发现用SAS直接连Sql Server,在Sql Server处理好表连接再把数据传回来要快一些,因为在Sql Server中的表已经创建索引了。不知道有什么可以提高SAS中的Proc Sql速度的方法。
playmore邀请您访问ChinaTeX论坛!!!进入ChinaTeX论坛

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-7 21:25