SAS从字典列中的选择中排除变量

时间:2014-09-21 23:47:04

标签: dictionary macros sas

我需要对变量列表进行循环,但不包括其中的一些变量。 我想为每个变量添加一个前缀,除了那些。

我写了一个宏:

%macro addprefijo(tabla);
proc contents data = labo2.&tabla.;
title 'before renaming'; run;

proc sql;
select nvar into :num_vars
from dictionary.tables
where libname='LABO2' and memname="&tabla";
%put 'num_vars' &num_vars;


select distinct(name) into :var1-:var%trim(%left(&num_vars))
from dictionary.columns
where libname='LABO2' and memname="&tabla" /*and name not in ('cid', 'COUNTY', 'ESTADO') */;
quit;



proc datasets library=LABO2;
modify &tabla;
rename
%do i=1 %to &num_vars.; 
&&var&i = &tabla._&&var&i.
%end;
;
quit;
run;

proc contents data=LABO2.&tabla.;
title' after renaming';
run;

%mend;

%addprefijo(A_CLI);

我尝试了评论的内容,但崩溃了,并且没有为所有变量添加前缀。这3个变量不在所有表格中。

我该如何解决?

由于

1 个答案:

答案 0 :(得分:1)

以下内容应该有效。使用proc contents out =而不是字典表。还使用sql separated by语法创建一个空格分隔的变量列表,而不是indervidual索引变量。

%macro addprefijo(tabla);
    proc contents 
        data = labo2.&tabla. 
        out = _a_contents 
        noprint;
    run;
    proc sql noprint;
        select NAME 
        into :vars separated by " "
        from _a_contents
        where NAME not in ('cid', 'COUNTY', 'ESTADO');
    quit;
    proc datasets library = labo2;
        modify &tabla.;
        rename
            %do i = 1 %to %sysfunc(countw(&vars., %str( ))); 
                %let var = %scan(&vars., &i., %str( ));
                &var. = &tabla._&var.
            %end;;
    quit;
%mend;
%addprefijo(A_CLI);