数据集中字段数量未知的 sas 动态调用 symput
sas dynamic call symput with unknown number of fields in the dataset
我有以下数据集
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;
如果这是你的数据结构,我会转置:
proc transpose data=parm2 out=parmt;
var _all_;
run;
然后引用这两列创建所有的宏变量及其对应的值:
data _null_;
set parmt;
call symput(_name_,col1);
run;
[已编辑 - 一些代码或代码行标有 *,因为 OP 不需要它]
使用 proc sql
字典获取数据中包含的变量名称,并使用 Memname
和 libname
规范。
使用data step
将获取的变量转化为宏变量。变量的名称存储在名为 name
的列名称下,这就是为什么我们必须将其作为 call symputx( 'variable ' !! left(_n_), **name** );
。宏变量Total
的作用是告诉你数据集中存在的变量个数。
现在你将有 variable1= a , variable2= 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 解决方案
经过一番研究,我找到了以下解决方案。虽然不是很完美,但值得分享。期待@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;
这是一个使用 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 ;
*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;
我有以下数据集
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;
如果这是你的数据结构,我会转置:
proc transpose data=parm2 out=parmt;
var _all_;
run;
然后引用这两列创建所有的宏变量及其对应的值:
data _null_;
set parmt;
call symput(_name_,col1);
run;
[已编辑 - 一些代码或代码行标有 *,因为 OP 不需要它]
使用 proc sql
字典获取数据中包含的变量名称,并使用 Memname
和 libname
规范。
使用data step
将获取的变量转化为宏变量。变量的名称存储在名为 name
的列名称下,这就是为什么我们必须将其作为 call symputx( 'variable ' !! left(_n_), **name** );
。宏变量Total
的作用是告诉你数据集中存在的变量个数。
现在你将有 variable1= a , variable2= 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 解决方案
经过一番研究,我找到了以下解决方案。虽然不是很完美,但值得分享。期待@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;
这是一个使用 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 ;
*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;