data myout ;
set braw.accounts end = eof;
fname = "BANK_ACCT";
retain countmissing cm2 0;
if missing(fname) = 0 then countmissing = countmissing+1;
if missing(BANK_ACCT) = 0 then cm2 = cm2 +1;
if eof then output;
keep fname countmissing cm2;
run;
(^不知道为什么不缩进)。
所以我想要做的是,从字典的变量名中读取,然后对每个变量进行分析,计算缺失的数字。
问题在于,当我将fname传递给missing()时,它正在寻找一个名为'fname'而不是'BANK_ACCT'的变量。如何在传递之前告诉它解决?
答案 0 :(得分:1)
有几种方法可以解决这个问题:
1)构造一个包含变量名的宏变量,然后定义一个数组。您发布的上一个问题将是一个很好的起点。像这样:
proc sql;
select name into :varlist separated by ' ' from dictionary.columns
where memname='DATASET' and libname='LIBRARY'
and <conditions defining which columns you want>;
quit;
data myout ;
set braw.accounts end = eof;
array fname &varlist;
do _t = 1 to dim(fname);
if missing(fname[_t]) = 0 then countmissing+1;
if missing(BANK_ACCT) = 0 then cm2 +1;
end;
if eof then output;
keep fname countmissing cm2;
run;
(还引入了一个新概念 - + 1;自动执行retain var 0; bit)
顺便说一句,你可能会发现使用CALL SYMPUT将countmissing放到一个宏变量而不是输出一行(取决于你用它的用途)是有用的。
2)与1类似,但您可以创建所有变量或所有数值变量的数组,或从一个点到另一个点的所有变量。
array fname _all_; *will only work if all variables are same type;
array fname _numeric_;
array fname var_first -- var_last; *all variables in order from left to right from var_first to var_last;
3)对“标准化”数据集进行操作,因此只有两个变量(或几个)的数据集 - “varname”和“value”。这需要一些(重要的)工作来创建,因此仅在某些情况下有用。
4)使用数据集以外的某种方法来解决这个问题。例如,PROC FREQ或PROC TABULATE可以为您提供每个变量缺失值的数量(使用缺少的选项)。