我有以下数据集
col1 q1 q2 q3 q4 q5
a - 2 1 2 2
b - - - - -
b 1 2 - - -
d 3 - - - -
Run Code Online (Sandbox Code Playgroud)
我想在 SAS 中应用一个条件,允许我删除所有列(q1 到 q5)为空的情况。我想看看这个:
col1 q1 q2 q3 q4 q5
a - 2 1 2 2
b 1 2 - - -
d 3 - - - -
Run Code Online (Sandbox Code Playgroud)
我能找到的最优雅的解决方案是:
data want;
array q[5];
set have;
if max(of q[*]) = . then delete;
run;
Run Code Online (Sandbox Code Playgroud)
一步步
data 语句设置输出数据集array 语句初始化一个名为的 5 元素数组 qset语句引入输入数据集。因为输入数据集有名为q1... 的变量q5,所以这些变量被填充到数组中。if 声明:在 SAS 中,任何数值都大于缺失值,因此任何最大值缺失的情况都意味着 的所有值q都缺失。的max(of q[*])语法简单地带回(用来表示所有*)的数组的元素的最大所有的q。delete在将符合条件的观察值加载到输出数据集之前删除它们。run 语句 - 数据步边界没有数组
感谢 SRSwift
data want;
set have;
if max(of q:) = . then delete;
run;
Run Code Online (Sandbox Code Playgroud)
使用 n 函数
感谢乔:
data want;
set have;
if n(of q:);
run;
Run Code Online (Sandbox Code Playgroud)
正如 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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
530 次 |
| 最近记录: |