Sas 删除字段包含空值的行

Sas 删除字段包含空值的行,sas,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 - - - - 我能找到的最优雅的解决方案是: dat

我有以下数据集

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
  • set
    语句引入输入数据集。由于输入数据集具有名为
    q1
    q5
    的变量,因此将这些变量填充到数组中
  • if
    语句:在SAS中,任何数值都大于缺失值,因此缺失最大值的任何情况都意味着缺失所有
    q
    值。
    max(of q[*])
    语法只是返回数组
    q
    中所有(*用于表示所有)元素的最大值
    delete
    在将符合条件的观测值加载到输出数据集之前删除这些观测值
  • run
    语句-数据步边界
不带数组

感谢斯威夫特

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
函数返回零,不满足条件并删除观测值

为了说明这一点,这里再次显示了输入数据集,并添加了
n
列:

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

通常情况下,最好显示您所采取的步骤,而不是仅仅要求为您编写代码。如果您需要一个开始的位置,您可能需要阅读以下内容:
If
/
where
(限制行)、
nmiss
(一个计算缺失值的函数)、
sum
(只有在其所有参数缺失时才会返回缺失)以及q:或q1-q5的变量列表
(将多个变量传递给函数)你还应该尝试使用专业语言-
想要
不是一个合适的词来回答SO问题。
想要
是正确的。@Joe修正了标题,在我做标题时,使语言更合适,这样就不会影响问题。你可以跳过数组,直接使用
max(q:)=.
在我写了所有关于数组的东西之后,我将把你的作为脚注添加,伟大的答案@srswift你也可以使用
n
如果n(of q:)=0,那么删除;
或者甚至
如果n(of q:);
因为它将在0时删除,而在>0时不删除。是的,我不得不承认您的解决方案是三种解决方案中最优雅的,但我可能会对它进行一些注释,以便大多数用户能够容易地理解它。我知道如果使用
语句方法(没有
那么
),将有一种
方法在那里的某个地方!我倾向于认为
n
在这里是一个很好的解决方案,即使没有文档(比
max
更好,后者可以工作,但不能清楚地执行它通常执行的操作),因为
n
是SAS中通常理解的一个概念,可以准确地执行此操作[指示非缺失值的数量],即使用户不熟悉data step函数;这与
PROC tablate
PROC MEANS
中的想法相同。也就是说,我永远不会反对在任何内容中添加注释和文档:)