有没有办法让字符变量在作为参数传递之前解析?

时间:2013-01-29 21:47:05

标签: sas

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'的变量。如何在传递之前告诉它解决?

1 个答案:

答案 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可以为您提供每个变量缺失值的数量(使用缺少的选项)。