仅基于变量值的空列-SAS数据集

时间:2019-08-16 14:10:16

标签: sas statistics proc-sql

我有一个非常大的SAS数据集,其中包含280多个变量,我需要根据一个Variable值检索所有完整的NULL列。例如,我在此数据集中有一个名为Reported(仅包含值Yes和No的变量),我想根据值No找出该数据集中所有完整的Null列。

有没有一种快速的方法可以解决此问题,而无需为完整的NULL值写所有列名?

例如,如果我在表中有4个变量,

enter image description here

因此,根据上表,我希望看到类似Var4 ='No'的输出,并且只返回所有缺少值的列

enter image description here

这将有助于我识别Var4值为“否”的根本没有填充的变量

2 个答案:

答案 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;