从数据集转换为宏变量

时间:2014-01-30 23:28:44

标签: sas

我的下面的数据集名为myDS,只有1行,列数可以是变量

下面我显示了4列但我​​可以少于或多于4列

   A        B        C        D

   3        4        "hello"        "apple" 

我想创建一个将输入作为数据集DS的宏 并输出以列

命名的宏变量

所以例如

& A应为3 和& B应该是4 & C应该是“你好”

这可行吗? 谢谢

3 个答案:

答案 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()函数获取列名。