列子集的行式操作

时间:2018-11-01 15:05:14

标签: sas

我有以下数据:

data df;
input id $ d1 d2 d3;
datalines;
a . 2 3
b . . .
c 1 . 3
d . . .
;
run;

我想对列的子集进行一些转换/操作。在这种情况下,这意味着删除所有以d为前缀的列全部丢失/为空的所有行。

这是我实现这一目标的一种方法,受到了this SO post的巨大影响。

首先,将所有数字列按行求和。

data df_total;
set df;
total = sum(of _numeric_);
run;

下一步,删除total丢失/为空的所有行。

data df_final;
set df_total;
where total is not missing;
run;

哪个给了我想要的输出:

a . 2 3
c 1 . 3

但是,我的问题是,这种方法假设只有一个“主键”列(在这种情况下为id),其他所有内容都是数字,因此应视为此{{ 1}}逻辑。

实际上,我在原始数据集sum(of _numeric_) is not missing中有各种各样的其他列,简单地df全部写掉所有这些都是不可行的。我知道要为其运行此“测试”的所有列均以drop作为前缀(更具体地说,匹配模式d)。

如何将这种方法扩展到特定的列子集?

1 个答案:

答案 0 :(得分:4)

使用另一个快捷方式参考,因为您知道所有参考都以D开头

total = sum( of D:);
if n(of D:) = 0 then delete;

这将添加数字变量并以D开头。如果您要排除以D开头的变量,那是有问题的。

由于它是数字,所以您也可以改用N()函数,该函数将计算行中不丢失的值。通常,SAS会自动对大多数PROCS(例如REG / GLM)执行此操作(显然不在数据步骤中)。

如果由于某种原因而无法使用,则可以从sashelp表中查询变量列表。

proc sql noprint;
select name into :var_list separated by ", " from sashelp.vcolumn
where libname='WORK' and memname='DF' and name like 'D%';
quit;

data df;
   set have;
   if n(&var_list.)=0 then delete;
run;
相关问题