我想使用SAS Proc SQL在表中找到我行,其中每列都有一个非缺失值。有没有办法做到这一点,而不必列出所有的列名?这不起作用,但它可能会让你知道我的预期输出是什么。使用SAS Proc SQL查找所有列不丢失的行?
Proc SQL;
Select *
from work.table
Where * is not null;
Run;
如果可能,我还想限制结果为一个观察值。谢谢。
我想使用SAS Proc SQL在表中找到我行,其中每列都有一个非缺失值。有没有办法做到这一点,而不必列出所有的列名?这不起作用,但它可能会让你知道我的预期输出是什么。使用SAS Proc SQL查找所有列不丢失的行?
Proc SQL;
Select *
from work.table
Where * is not null;
Run;
如果可能,我还想限制结果为一个观察值。谢谢。
在SQL,因为你不能在一个项目中的所有变量,而无需使用宏语言平凡的。在datastep中,这是微不足道的。
data class;
set sashelp.class;
if mod(_n_,3)=1 then call missing(age);
run;
data want;
set class;
if cmiss(of _all_)=0;
run;
cmiss
指示1,如果一个字符或数字变量缺失(和特别是在这种情况下,计数missings的总数)。您可以使用数据步骤中的obs=1
选项将其限制为一个。
在SQL中,您必须是显式的。 *
不是扩展列的通用宏。它是在select *
和count(*)
中恰好使用的句法元素。
所以,这样的事情:
Proc SQL;
Select *
from work.table
Where col1 is not null and col2 is not null and col3 is not null . . .
Run;
使用SQL和字典表:
proc sql noprint;
select cats('not missing(', name, ')')
into :expression separated by " and "
from dictionary.columns
where libname = "SASHELP" and memname = "CLASS";
quit;
proc sql outobs=1;
select *
from sashelp.class
where &expression.;
quit;
这个工作!谢谢。对于将来可能想要使用Joe代码的任何人的记录,只需将if cmiss(of _all_)等于1而不是0,以获得包含所有非缺失值的行。 –
为什么要将它更改为1?那意味着你寻找一行*一个*缺失值。所有的拒绝将是0. – Joe
你是对的。最初cmiss = 0确实没有返回结果,但我现在意识到这是因为原始表中有一列,每一行都有一个缺失值。当我删除该列时,是的,cmiss = 0是正确的。谢谢。 –