【问题标题】:SAS dynamically declaring macro variableSAS动态声明宏变量
【发布时间】:2014-08-31 03:17:55
【问题描述】:

我的公司刚刚从 R 切换到 SAS,我正在将我的很多 R 代码转换为 SAS。我在 SAS 中动态声明变量(宏变量)时遇到了一个巨大的问题。

例如,我的一个流程需要获取一列的平均值,然后在多个步骤中将其应用到整个代码中。

%let numm =0;

我用我的 numm 变量尝试了以下方法,但两种方法都不起作用,而且我似乎在网上找不到任何东西。

PROC MEANS DATA = ASSGN3.COMPLETE mean;
#does not work
&numm = VAR MNGPAY;
run;

Proc SQL;
#does not work
&numm =(Select avg(Payment) from CORP.INV);
quit;

【问题讨论】:

  • 宏变量通常不应该存储数据值。它们只是文本。除此之外,它们没有数值精度的概念,因此在转换为宏变量时会丢失精度。 SAS 在很多方面更像 SQL 而不是 R。将您的方法存储在数据集中。
  • 是的,我确实注意到 SAS 更像是一个可以执行统计的数据管理系统。 R 似乎更适合高级分析。
  • SAS 与 R 一样能够进行高级分析,而且在某些方面要快得多。它只是不同,需要以不同的方式进行编程。您在上面所做的就像在函数内部使用 C(或 R,就此而言)中的全局变量;你不会在 SAS 中这样做。但是,通常可以通过更简单的方式,使用更惯用的过程来实现相同的结果。

标签: sas


【解决方案1】:

我强烈建议购买一本有关 SAS 的书籍或参加 SAS 培训课程。 SAS Programming II 是一个很好的起点(如果您还没有编程过其他任何东西,那么编程 I,但听起来不是这样)。您拥有的代码表明您需要它。这是从 R 的完全范式转变。

也就是说,试试这个:

proc sql noprint;
select mean(payment) into :numm from corp.inv;
quit;

%put The mean is: &numm;

【讨论】:

    【解决方案2】:

    这是过程摘要/数据步骤等价物:

    proc summary data = corp.inv;
      var payment;
      output out = inv_summary mean=;
    run;
    
    data _null_;
      set inv_summary;
      call symput('numm',payment);
    run;
    
    %put The mean is: &numm;
    

    如果您只需要简单的算术平均值,Proc sql 是一种更紧凑的方法,但如果您需要更复杂的统计数据,则使用 proc summary 是有意义的。

    【讨论】:

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