我有以下数据集
col1 q1 q2 q3 q4 q5
a - 2 1 2 2
b - - - - -
b 1 2 - - -
d 3 - - - -
我想在SAS中应用一个条件,允许我删除所有列(q1到q5)为空的情况。我想看到这个:
col1 q1 q2 q3 q4 q5
a - 2 1 2 2
b 1 2 - - -
d 3 - - - -
答案 0 :(得分:4)
我能找到的最优雅的解决方案是:
data want;
array q[5];
set have;
if max(of q[*]) = . then delete;
run;
<强>步骤一步强>
data
语句设置输出数据集array
语句初始化名为q
set
语句引入输入数据集。由于输入数据集包含名为q1
... q5
的变量,因此这些变量将填充到数组中。if
语句:在SAS中,任何数值都大于缺失,因此任何缺少最大值的情况都意味着缺少q
的所有值。 max(of q[*])
语法简单地返回数组q
的所有(*用于表示所有)元素的最大值。 delete
删除符合条件的观察值,然后才能将它们加载到输出数据集中。run
声明 - 数据步边界没有数组
感谢SRSwift
data want;
set have;
if max(of q:) = . then delete;
run;
使用n功能
感谢Joe:
data want;
set have;
if n(of q:);
run;
正如Joe在评论中解释的那样,n
计算非缺失值,而if
语句后跟条件只允许观察结果传入输出数据集(如果该条件为真)(或一个非零整数)。如果全部缺失,n
函数返回零,则不满足条件并删除观察值。
为了说明这一点,这里再次输入数据集,添加了n
列:
col1 q1 q2 q3 q4 q5 n
a . 2 1 2 2 4
b . . . . . 0
b 1 2 . . . 2
d 3 . . . . 1