【问题标题】:Pass PDV variables to macro in SAS将 PDV 变量传递给 SAS 中的宏
【发布时间】:2016-05-19 00:05:26
【问题描述】:

在我的程序中,我想将所有变量从列传递到 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 上。

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

【问题讨论】:

  • 您为什么要在另一个数据步骤中运行一个数据步骤?另外,您能否澄清“将所有变量从列传递到宏”的意思?我不明白你到目前为止所做的尝试是如何实现这一目标的。
  • 您是在尝试传递变量值还是变量名?
  • 不是那样做的。使用调用执行。 support.sas.com/documentation/cdl/en/mcrolref/67912/HTML/…

标签: macros sas


【解决方案1】:

您的代码不会以这种方式工作,因为您是在另一个数据步骤中发出数据步骤语句。要做到这一点,您需要以不同的方式进行设置。以下是操作方法。

首先让我们生成一个名为列的数据集(冒充您的T.BetterSet 表),我们将在其中插入值column1column2column5——即我们想要的列请参阅稍后在同名表中复制。

data columns;
  informat column $32.;
  input column;
  datalines;
column1
column2
column5
;

然后我们将生成包含列column1column5 的示例数据(冒充您的End.DatasetpreparedForAnalisys 表)。鉴于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 的新表中的 column5 中保留了 4 个观察值

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多