我有一个非常大的SAS数据集,其中包含280多个变量,我需要根据一个Variable值检索所有完整的NULL列。例如,我在此数据集中有一个名为Reported(仅包含值Yes和No的变量),我想根据值No找出该数据集中所有完整的Null列。
有没有一种快速的方法可以解决此问题,而无需为完整的NULL值写所有列名?
例如,如果我在表中有4个变量,
因此,根据上表,我希望看到类似Var4 ='No'的输出,并且只返回所有缺少值的列
这将有助于我识别Var4值为“否”的根本没有填充的变量
答案 0 :(得分:3)
请注意PROC FREQ中的WHERE语句。
proc format;
value $_xmiss_(default=1 min=1 max=1) ' ' =' ' other='1';
value _xmiss_(default=1 min=1 max=1) ._-.Z=' ' other='1';
quit;
%let data=sashelp.heart;
proc freq data=&data nlevels;
where status eq: 'A';
ods select nlevels;
ods output nlevels=nlevels;
format _character_ $_xmiss_. _numeric_ _xmiss_.;
run;
data nlevels;
length TABLEVAR $32 TABLEVARLABEL $128 NLEVELS NMISSLEVELS NNONMISSLEVELS 8;
retain NLEVELS NMISSLEVELS NNONMISSLEVELS 0;
set nlevels;
run;
答案 1 :(得分:2)
我认为这个问题有两个部分。首先是子集记录,其中Reported =“ N”。然后在这些记录中,报告所有缺少值的列。如果这是正确的,那么您可以执行以下操作(我假设缺少值的列都是数字。如果不正确,则此方法将需要稍作修改):
/* Thanks to REEZA for pointing out this way of getting the freqs. This eliminates some constraints and is more efficient */
proc freq data=have nlevels ;
where var1 = "N" ;
ods output nlevels = freqs;
table _all_;
run;
proc sql noprint;
select TableVar into :cols separated by " " from freqs where NNonMissLevels = 0 ;
quit;
%put &cols;
data want;
set have (keep = &cols var1);
where var1 = "N" ;
run;