删除字段包含空值的行

CA_*_*_CA 2 sas

我有以下数据集

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)

mjs*_*squ 5

我能找到的最优雅的解决方案是:

data want;
  array q[5];
  set have;
  if max(of q[*]) = . then delete;
run;
Run Code Online (Sandbox Code Playgroud)

一步步

  • data 语句设置输出数据集
  • array 语句初始化一个名为的 5 元素数组 q
  • set语句引入输入数据集。因为输入数据集有名为q1... 的变量q5,所以这些变量被填充到数组中。
  • if 声明:在 SAS 中,任何数值都大于缺失值,因此任何最大值缺失的情况都意味着 的所有值q都缺失。的max(of q[*])语法简单地带回(用来表示所有*)的数组的元素的最大所有的qdelete在将符合条件的观察值加载到输出数据集之前删除它们。
  • 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)

  • 您可以跳过数组并使用 `max(of q:) = .` (3认同)
  • 你也可以只使用 `n`: `if n(of q:) = 0 then delete;` 甚至 `if n(of q:);` 因为它会在 0 时删除,而不是在 >0 时删除。 (3认同)