【问题标题】:SAS: Utilizing macro variables as numbers in data stepSAS:在数据步骤中使用宏变量作为数字
【发布时间】:2017-03-29 14:50:58
【问题描述】:

我正在修改我编写的一些 SAS 代码,并找到了一段我希望更有效地执行的代码。我有一个名为“预测”的时间序列数据集,它只包含日期和给定日期的“预测”变量。

我写了一个简单的代码块来获取这个变量,基本上把它分成一系列变量,每个变量代表一个日期:

data forecasts;
set forecasts;
  obs=_n_; 
  array r(241);
  do i=1 to dim(r);
    if obs=i then r(i)=Forecast;
  end; drop i; drop obs; drop forecast;
run;

但是,这段代码的“r(241)”部分真的让我很恼火。我已经有一个宏变量,它对应于我需要执行此操作的次数(称为“n”),我宁愿直接将其插入数组声明中,例如:

array r(&n)

等等。

但是,宏变量显然被视为文本,因此即使我设法将宏变量导入数据步骤,变量 r(&n) 也不起作用,因为它不会将“n”读取为数字。除了将整个数据步骤包装成更广泛的宏之外,我如何将“n”拉入数据步骤,然后将其转换为数字以便此操作有效?

【问题讨论】:

    标签: macros sas datastep


    【解决方案1】:

    声明:

    array r(&n) ;
    

    应该没问题,假设宏变量已定义并且具有整数值。请展示您如何尝试使用它(以及任何失败的日志消息)。您不需要“将宏变量导入数据步骤”。宏变量是文本,因为它们的主要工作是解析为 SAS 代码。

    18   %let n=3;
    19   data _null_;
    20     array r{&n};
    21     do i=1 to dim(r);
    22       put i=;
    23     end;
    24   run;
    
    i=1
    i=2
    i=3
    

    【讨论】:

    • 奇怪的是,我想我什么都试过了,除了 &n,使用各种过于复杂的调用等。使用 &n 确实工作得很好,很抱歉浪费你的时间。
    【解决方案2】:

    作为一个建议,您不需要这样做。 PROC TRANSPOSE 就是为此目的而存在的。然后你甚至不必知道有多少变量/行。

    data forecast;
      call streaminit(7);
      do id = 1 to 243;
        forecast = rand('Normal')*5;
        output;
      end;
    run;
    
    proc transpose data=forecast out=forecasts prefix=r;
      by id;
      id id;
      var forecast;
    run;
    

    如果您实际上不想要 243 行而只想要一个,请转储 byid 语句。

    即使您想在数据步骤中执行此操作,也可以通过将 set循环内。这里我使用自动删除的变量_n_ 来迭代循环。

    data forecasts;
      do _n_ = 1 by 1 until (eof);
        set forecast end=eof;
        array r(243);
        r[_n_] = forecast;
        output; *if you actually want one row per original row still;
        call missing(r[_n_]); *clear it out;
      end;
      drop forecast;
    run;
    

    【讨论】:

    • 请注意,我在示例中使用的是 243,而不是 241,因此请将其调整为正确的值。
    • 非常酷,我的数据集实际上比 241 个变量大得多,所以我会弄清楚并实施它以节省时间。
    • 我还要注意,根据您执行此操作的目的,可能有更好的方法来执行此操作 - 例如,如果您正在创建对角矩阵,PROC IML 是这样做的地方,以及一些更高级的回归/等。类型分析例程也可以为您执行此操作。
    • 感谢您的帮助,我需要进一步了解如何使用“By”。目前我处于 SAS 水平,我可以做大部分我需要的事情,但有时感觉就像我只是在用锤子砸东西,以牺牲效率和良好的代码为代价。因此,所有建议都值得赞赏。
    猜你喜欢
    • 1970-01-01
    • 2019-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-01
    相关资源
    最近更新 更多