我有以下数据集
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;
答案 0 :(得分:5)
如果这是您数据的结构,我会调换:
proc transpose data=parm2 out=parmt;
var _all_;
run;
然后引用两列来创建所有宏变量及其对应的值:
data _null_;
set parmt;
call symput(_name_,col1);
run;
答案 1 :(得分:2)
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
字典,使用Memname
和libname
规范获取数据中包含的变量名称。
使用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解决方案