【问题标题】:SAS code incorrectly passing value of macro variable as new column/variable in outputSAS代码错误地将宏变量的值作为输出中的新列/变量传递
【发布时间】:2018-02-27 13:44:08
【问题描述】:

伸出手来了解正在发生的事情......

我将一些日期存储在一些宏变量中 -

data _null_;
call symput('month_tag',put(intnx('month',today(),-0),monname3.));
call symput('year',put(intnx('year',today(),0),year.));
run;
%put &month_tag &year;

然后我们可以使用这个样本数据集 -

data sample;
input test_a test_b test_c;
cards;
173 181 172
;
run;

数据集代表了在完成许多摘要之后流程中的最后一步。我们希望显示这些带有时间段的摘要。如果我将保存日期的宏变量传递给新创建的invoice 变量,我们就不会得到我们想要的 -

data out;
set sample;
invoice = &month_tag._&year;
run;

如果您可以运行此输出,您将看到出于某种原因,SAS 正在按应有的方式创建变量 invoice,但它没有使用宏变量值,而是采用该值并生成另一个具有该值的变量作为新变量的名称。

我解决了这个问题 -

data out2;
set sample;
invoice = "&month_tag._&year";
run;

我的直觉告诉我,这与我在 invoice 变量中使用/打印 &month_tag._&year 的方式有关,但如果有人能为我解决这个问题,我将不胜感激。

【问题讨论】:

  • &month_tag._&year解析为Feb_2018,不带“ ”,在sample中视为变量,在sample中显然不存在,所以invoice得到缺失值;带“ ”的,视为值(Feb_2018)。

标签: sas sas-macro


【解决方案1】:

宏变量的值只是替换引用,然后 SAS 将生成的文本解释为要运行的代码。所以你只是在描述这两种说法之间的区别。

invoice = Feb_2018;
invoice = "Feb_2018";

在第一个中,右侧是变量引用。第二个是字符串文字。

【讨论】:

  • 解释是有道理的......我的监督足够简单。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-07
  • 1970-01-01
相关资源
最近更新 更多