删除字段包含空值的行

时间:2015-01-29 20:34:01

标签: sas

我有以下数据集

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

1 个答案:

答案 0 :(得分:4)

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

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

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