我的下面的数据集名为myDS,只有1行,列数可以是变量
下面我显示了4列但我可以少于或多于4列
A B C D
3 4 "hello" "apple"
我想创建一个将输入作为数据集DS的宏 并输出以列
命名的宏变量所以例如
& A应为3 和& B应该是4 & C应该是“你好”
这可行吗? 谢谢
答案 0 :(得分:3)
基于Chris J的建议;
%macro to_vars(ds);
data _null_;
set &ds;
array nums[*] _numeric_;
array chars[*] _character_;
do i=1 to dim(nums);
call symputx(vname(nums[i]),nums[i],'G');
end;
do i=1 to dim(chars);
call symputx(vname(chars[i]),chars[i],'G');
end;
run;
%mend;
答案 1 :(得分:2)
如果您使用的是SAS 9.2,则以下内容将起作用。 [改编自SAS documentation]
更新:在SAS 9.1中也可以正常使用。
[注意:字符变量在创建的宏中没有引号。但是,如果您的数据集带有嵌入双/单引号的字符变量,那么宏变量也将具有它们]
%let dsid=%sysfunc(open(myDS,i));/*open the dataset which has macro vars to read in cols*/
%syscall set(dsid); /*no leading ampersand with %SYSCALL */
%let rc=%sysfunc(fetchobs(&dsid,1));/*just reading 1 obs*/
%let rc=%sysfunc(close(&dsid));/*close dataset after reading*/
%put _user_;
%Put _user_
将以下内容写入日志:
GLOBAL A 3
GLOBAL B 4
GLOBAL C hello
GLOBAL D apple
[上面的输出与@DomPazz宏解决方案使用以下数据集提供的内容完全相同]
data myDS;
A=3;
B=4;
C="hello";
D="apple";
run;
因此,您可以看到myDS数据集中的所有变量都映射到相应的宏变量。 您可以参考Functions and CALL Routines by Category来理解上述代码中使用的各种SAS函数。
答案 2 :(得分:0)
是的,这是可行的。您可以将数据转换为两列,或使用两个数组 - 一个用于数字列,另一个用于字符列,迭代每个数组,使用vname()函数获取列名。