仅基于变量值的空列 - SAS 数据集
Null Columns only based on a variable value - SAS Dataset
我有一个非常大的 SAS 数据集,其中包含 280 多个变量,我需要根据变量值检索所有完整的 NULL 列。例如,我在此数据集中有一个名为 Reported 的变量(只有值 Yes 和 No),我想根据值 No 找出此数据集中所有完整的空列。
有没有什么快速的方法可以在不为完整的 NULL 值写入所有列名的情况下找到这个问题?
例如,如果我在 table、
中有 4 个变量
所以基于上面的 table 我希望看到这样的输出,其中 Var4='No' 并且只有 return 包含所有缺失值的列
这将帮助我识别在 Var4 值为 'No'
时根本没有填充的变量
注意 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 TABLEVARLABEL 8 NLEVELS NMISSLEVELS NNONMISSLEVELS 8;
retain NLEVELS NMISSLEVELS NNONMISSLEVELS 0;
set nlevels;
run;
我认为这个问题有两个部分。首先是对 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;
我有一个非常大的 SAS 数据集,其中包含 280 多个变量,我需要根据变量值检索所有完整的 NULL 列。例如,我在此数据集中有一个名为 Reported 的变量(只有值 Yes 和 No),我想根据值 No 找出此数据集中所有完整的空列。
有没有什么快速的方法可以在不为完整的 NULL 值写入所有列名的情况下找到这个问题?
例如,如果我在 table、
中有 4 个变量所以基于上面的 table 我希望看到这样的输出,其中 Var4='No' 并且只有 return 包含所有缺失值的列
这将帮助我识别在 Var4 值为 'No'
时根本没有填充的变量注意 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 TABLEVARLABEL 8 NLEVELS NMISSLEVELS NNONMISSLEVELS 8;
retain NLEVELS NMISSLEVELS NNONMISSLEVELS 0;
set nlevels;
run;
我认为这个问题有两个部分。首先是对 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;