如何在SAS数据集中获取每行最后一个非空的value_系列列值?
解决SAS中提取每行最后一个非空value列的问题
我来帮你搞定这个需求!你现在需要从dim_point数据集中,为每行提取value_0到value_4里最后一个非空的值作为新的value列,下面给你两种实用的解决方案:
方法1:用COALESCEC函数(SQL步,适合列数少的场景)
因为你的value_*列是字符型,所以用字符版的合并函数COALESCEC——它会从左到右返回第一个非空的参数。我们把列从最后一个到第一个倒序传入,这样得到的就是每行最后一个非空的value值:
proc sql; create table want as select rk, ID, name, coalescec(value_4, value_3, value_2, value_1, value_0) as value from dim_point; quit;
这个方法代码非常简洁,适合列数固定且不多的情况,直接就能得到你要的want数据集。
方法2:用数组循环(DATA步,适合列数多的场景)
如果以后你的value_*列数量变多(比如到value_100),用数组会更灵活,不用一个个列名写出来:
data want; set dim_point; /* 定义数组包含所有value_开头的列,或者直接用value_0-value_4指定范围 */ array vals[*] value_0-value_4; /* 从数组最后一个元素往前循环 */ do i = dim(vals) down to 1; if not missing(vals[i]) then do; value = vals[i]; /* 找到非空值就赋值 */ leave; /* 找到后退出循环,不用继续找 */ end; end; /* 保留需要的列 */ keep rk ID name value; run;
这个方法的优势是扩展性强,不管你的value列有多少,只要列名有规律(比如都是value_加数字),改一下数组的范围就行。
补充说明
你之前的代码只是把name复制成value再清空,没有处理提取最后一个非空值的逻辑,用上面任意一种方法都能替换掉原来的更新步骤,直接生成目标数据集。
内容的提问来源于stack exchange,提问作者Azeem112
相关产品推荐
相关产品推荐

