在我的程序中,我想在SAS中将所有变量从列传递到宏。我有这样的代码:
data _null_;
set T.BetterSet;
%test(myCollumn);
run;
这是一个简单的宏:
%macro test(variable);
data &variable;
set End.DatasetpreparedForAnalisys;
where &variable <= 0;
keep vin3 &variable;
run;
%mend;
不幸的是我收到了错误:错误:变量“变量”不在文件End.DatasetpreparedForAnalisys上。
如何解决这个问题?为什么传递变量不能按预期工作?
答案 0 :(得分:1)
由于您在另一个数据步骤中发出数据步骤语句,因此您的代码将无法正常工作。要做那种事情,你需要以不同的方式进行设置。这是如何做到的。
首先让我们生成一个名为columns的数据集(假设为T.BetterSet
表),我们将在其中插入值column1
,column2
和column5
- 这是,我们希望看到的列在稍后的同名表中复制。
data columns;
informat column $32.;
input column;
datalines;
column1
column2
column5
;
然后我们将生成包含End.DatasetpreparedForAnalisys
列到column1
列的示例数据(冒充您的column5
表)。给定columns
表的内容,以后只有第1,2和5列成为独立表。
data sampleData;
informat column1-column5 8.;
input column1-column5;
datalines;
12 -1 2 3 0
-2 -3 -1 0 -3
0 -4 -5 -2 -9
-1 -5 4 2 0
;
现在我们声明一个宏%createTable
,它将发出为各列创建输出数据集所需的所有语句。
%macro createTable(col);
data &col;
set sampleData;
where &col <= 0;
keep &col;
run;
%mend;
所有现在都已设置为使用call execute
例程。使用call execute
允许您在我们称之为“并行”的过程中发出语句;也就是说,语句不会包含在当前数据步骤中,而是作为由SAS编译和执行的独立语句块发送。请注意,'%createTable'宏调用放在单引号中。这是关键,否则,你会遇到问题。
data _null_;
set columns;
call execute(cats('%createTable(', column, ')'));
run;
现在日志显示:
NOTE: There were 3 observations read from the data set WORK.COLUMNS.
NOTE: DATA statement used (Total process time):
real time 0.00 seconds
cpu time 0.00 seconds
NOTE: CALL EXECUTE generated line.
1 + data column1; set sampleData; where column1 <= 0; keep column1; run;
NOTE: There were 3 observations read from the data set WORK.SAMPLEDATA.
WHERE column1<=0;
NOTE: The data set WORK.COLUMN1 has 3 observations and 1 variables.
(...)
2 + data column2; set sampleData; where column2 <= 0; keep column2; run;
NOTE: There were 4 observations read from the data set WORK.SAMPLEDATA.
WHERE column2<=0;
NOTE: The data set WORK.COLUMN2 has 4 observations and 1 variables.
(...)
3 + data column5; set sampleData; where column5 <= 0; keep column5; run;
NOTE: There were 4 observations read from the data set WORK.SAMPLEDATA.
WHERE column5<=0;
NOTE: The data set WORK.COLUMN5 has 4 observations and 1 variables.
(...)
从而确认