删除字段包含空值的行

Remove rows where fields contain null values

我有以下数据集

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 -  -  -   -

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

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

循序渐进

  • data语句设置输出数据集
  • array 语句初始化一个名为 q
  • 的 5 元素数组
  • 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函数

感谢乔:

data want;
  set have;
  if n(of q:);
run;

正如 Joe 在他的评论中所解释的那样,n 计算非缺失值,并且 if 语句后跟一个条件只允许在该条件为真时将观察值传递到输出数据集中(或非零整数)。在全部缺失的情况下,n函数returns归零,不满足条件,去掉观察。

为了说明这一点,这里又是输入数据集,添加了 n 列:

col1 q1 q2 q3 q4 q5 n 
a    .  2  1  2  2  4 
b    .  .  .  .  .  0 
b    1  2  .  .  .  2 
d    3  .  .  .  .  1