sas动态调用在数据集中具有未知数量的字段的同义词

时间:2015-06-18 02:10:24

标签: sas

我有以下数据集

data parm2;
    input a b c d e;
    datalines;
1 2 3 4 A
;
run;

问题1:我想要一组宏变量。假设我不知道字段的数量及其对应的字段名称。

问题2:字段数据类型不同。

期望的操作如下:

data _null_;
    set parm2;
call symput('a',a);
call symput('b',b);
call symput('c',c);
call symput('d',d);
call symput('e',e);
run;

%put &a;

4 个答案:

答案 0 :(得分:5)

如果这是您数据的结构,我会调换:

proc transpose data=parm2 out=parmt;
  var _all_;
run;

然后引用两列来创建所有宏变量及其对应的值:

data _null_;
  set parmt;
  call symput(_name_,col1);
run;

答案 1 :(得分:2)

经过一些研究,我发现了以下解决方案。虽然不是一个完美的但值得分享。期待@Reeze回答

data _null_;
    set parm2;
    array t(*) _numeric_;   /*this deal with different data type*/
    do i = 1 to dim(t);
        call symput(vname(t[i]), t[i]);
    end;
    array t2(*) _character_;
    do i = 1 to dim(t2);
        call symput(vname(t2[i]), t2[i]);
    end;
run;

答案 2 :(得分:1)

这里是一个使用VVALUEX的Call VNEXT解决方案,假设你没有一个与它似乎有效的自动变量同名的变量。来自SAS的衍生解决方案注意:http://support.sas.com/kb/24/798.html

data parm2;
    input a b c d e $;
    datalines;
1 2 3 4 A
;
run;


data _null_;
  set parm2;
  length name $32;

 *temporarily set name to not missing to start loop;
  name='blank';
  do while(name ne " ");
    call vnext(name);

    /* Omit automatic variables, and variables created in this step only */
    if trim(name) not in('list','name','flag','i',' ','_ERROR_','_N_') then 
      call symput(name, vvaluex(name));

  end;
run;

%put &a;
%put &b;
%put &c;
%put &d;
%put &e;

答案 3 :(得分:0)

[已编辑 - 某些代码或代码行标有*,因为OP不需要它]

使用proc sql字典,使用Memnamelibname规范获取数据中包含的变量名称。

使用data step将变量获取到marco变量中。变量名称存储在名为name的列名称下,这就是我们必须将其设置为call symputx( 'variable ' !! left(_n_), **name** );的原因。宏变量Total的功能是告诉数据集中存在的变量数量。

现在你有变量1 = a,变量2 = b ....

%macro definevar ( library, dataset);
proc sql;
create table Attribute as
select * from dictionary.columns;
where memname = upcase( &dataset ) and libname = upcase(&library);
quit;

data letmacro;
set Attribute end=end;
call symputx( 'variable ' !! left(_n_), name );
* if end then call symputx ( Total, _n_);
run;



/*
***** extra ********
data _null_;
set &dataset ;
%do i=1 to &total;
   call symputx ( "var&i" !! left(_n_), &&variable&i );
%end;
run;
***** extra ********
*/

%mend definevar;

%definevar( ifanylibrary, parm2)

我期待通过@Reeza学习CALL VNEXT解决方案