【问题标题】:keep variables with a doop loop sas用doop循环sas保持变量
【发布时间】:2018-08-23 14:21:38
【问题描述】:

是否有任何形式可以在数据步骤中保持带有doop循环的变量? 将是:

data test;
input id aper_f_201501 aper_f_201502 aper_f_201503 aper_f_201504 
aper_f_201505 aper_f_201506;
datalines;
1 0 1 2 3 5 7
2 -1 5 4 8 7 9
;
run;

%macro test;
%let date = '01Jul2015'd;

data test2;
set test(keep=do i = 1 to 3;
                 aper_f_%sysfunc(intnx(month,&date,-i,begin),yymmn6.);
              end;)
run;
%mend;
%test;

我需要迭代几个日期。 非常感谢。

【问题讨论】:

  • 否,但如果你有一个共同的前缀,你可以使用快捷方式引用。

标签: loops sas


【解决方案1】:

您需要使用宏%do 循环而不是数据步骤do 循环,这在数据集选项的中间无效。也不要在数据集选项的中间生成那些额外的分号。并且一定要包含一个分号来结束您的 SET 语句。

%macro test;
%local i date;
%let date = '01Jul2015'd;

data test2;
  set test(keep=
%do i = 1 %to 3;
  aper_f_%sysfunc(intnx(month,&date,-i,begin),yymmn6.)
%end;
  );
run;
%mend;
%test;

【讨论】:

  • Wooow 它运作良好@Tom 非常感谢。 to 和宏变量 i 中缺少 %。为什么将 i 和 date 声明为局部宏变量?没有本地词也很好用。
  • @SandraGuerrero 最好将它们定义为本地,以确保不会与全局宏变量发生冲突。它没有必要工作,但如果你的主程序中有&i&date,它可能会发生冲突并导致问题。
  • 好的,我明白你的意思。 @Joe 谢谢。
  • 我更新了答案,将缺少的% 包含在%to 关键字中。
【解决方案2】:

您可以使用冒号快捷方式来引用具有相同前缀的变量,冒号前面的任何内容都将被保留。

keep ID aper_f_2015: ;

当你有顺序列表时还有一个连字符

keep ID aper_f_201501-aper_f_201512;

您可以使用宏,但不确定它在这里增加了很多价值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多