全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
2780 5
2013-06-26
我这里有一个指标,设为X,需要用A、B、C和D三个变量的加权平均来得到
其中,如果相邻的两个变量之一是缺失的,则用非缺失的那个代替
且靠前的指标有效性较高,如果缺失值两边都有值,则用前面的值代替
举个例子,如果B和D缺失,则B用A代替,D用C代替
如果A和B缺失,则都用C代替

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

二维码

扫码加我 拉你入群

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

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

全部回复
2013-6-26 10:01:48
如下:
先更新c,在更新b,最后更新a和d(a,d先后顺序无所谓)
复制代码
二维码

扫码加我 拉你入群

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

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

2013-6-26 13:14:33
moyunzheng 发表于 2013-6-26 10:01
如下:
先更新c,在更新b,最后更新a和d(a,d先后顺序无所谓)
嗯,不错,才想到有COALESCE这个函数,过去见到过但从未用过
二维码

扫码加我 拉你入群

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

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

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

扫码加我 拉你入群

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

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

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步高,但下面程序中证明想法是错的。
复制代码
二维码

扫码加我 拉你入群

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

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

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速度的方法。
二维码

扫码加我 拉你入群

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

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

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群