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
语句:在SAS中,任何数值都大于缺失值,因此缺失最大值的任何情况都意味着缺失所有if
值。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
中的想法相同。也就是说,我永远不会反对在任何内容中添加注释和文档:)