在PD中将PDV变量传递给宏

时间:2016-05-19 00:05:26

标签: macros sas

在我的程序中,我想在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上。

如何解决这个问题?为什么传递变量不能按预期工作?

1 个答案:

答案 0 :(得分:1)

由于您在另一个数据步骤中发出数据步骤语句,因此您的代码将无法正常工作。要做那种事情,你需要以不同的方式进行设置。这是如何做到的。

首先让我们生成一个名为columns的数据集(假设为T.BetterSet表),我们将在其中插入值column1column2column5 - 这是,我们希望看到的列在稍后的同名表中复制。

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.
(...)

从而确认

  • 在名为column1
  • 的新表中保留了来自column1的3个观察结果
  • 4个观察结果保存在名为column2
  • 的新表格中的column2中
  • 在名为column5
  • 的新表格中保留了第5列的4个观察结果