【问题标题】:SAS Macro to R %sysfuncSAS 宏到 R %sysfunc
【发布时间】:2014-02-21 00:17:12
【问题描述】:

我目前正在将 SAS 脚本转换为 R。由于我对 SAS 比较陌生,因此很难理解以下语句 -

VARS=date id sales units 
/* create lag event variable names to be used in the RETAIN statement */
%let vars_l = lag_%sysfunc(tranwrd(&vars,%str( ),%str( lag_))); 

在这里,日期、id 等都是我当前数据集中存在的变量。我了解函数 tranwrd 用于将字符变量中的另一个值替换为另一个值。在这种情况下,它将新项目创建为 -

vars_l = lag_date lag_id lag_sales lag_units

我说的对吗? vars_l 是什么?是清单吗?或者这些变量是否添加到我的数据集中? 另外,在下面的代码中 %sysfunc 之前的滞后有什么用?

%let vars_l = lag_%sysfunc(tranwrd(&vars,%str( ),%str( lag_))); 

是完全创建了滞后变量,还是只创建了没有以 lag_ 为前缀的值的变量?

我无权访问 SAS 或数据集来尝试检查结果。对此的任何帮助都会很棒。谢谢!

【问题讨论】:

    标签: r sas lag file-conversion


    【解决方案1】:

    以下代码基本上是创建宏变量来保存要处理的变量列表。 (注意:SAS 中的宏只是文本替换!)

    %let VARS=date id sales units ;
    /* create lag event variable names to be used in the RETAIN statement */
    %let vars_l = lag_%sysfunc(tranwrd(&vars,%str( ),%str( lag_))); 
    

    如果您运行以下代码(要查看究竟存储在 VARSvars_l 宏中,您会在日志中看到以下内容:

    31         %put VARS::&VARS.;
    SYMBOLGEN:  Macro variable VARS resolves to date id sales units
    VARS::date id sales units
    32         %put VARS_l::&VARS_L.;
    SYMBOLGEN:  Macro variable VARS_L resolves to lag_date lag_id lag_sales lag_units
    VARS_l::lag_date lag_id lag_sales lag_units
    

    R 中,等效项如下:

    VARS<-c("date", "id", "sales", "units" )
    vars_l<-paste("lag_",VARS, sep="")
    

    第二个vars_l 宏赋值只是将lag_ 添加到VARS 宏变量中每个空格分隔值的开头。由于第一个值不以空格开头,如果您在 %let vars_l = lag_%sysfunc(tranwrd(&amp;vars,%str( ),%str( lag_))); 的开头省略 lag_,您将在 vars_l 中存储以下内容:date lag_id lag_sales lag_units

    从代码中我可以看到尚未创建任何变量,但您应该稍后会找到一个 data step 来执行此操作。 cmets 中提到的RETAIN 声明就表明了这一点。

    【讨论】:

    • 是的。以下行确实有一个合并命令和 RETAIN VARS_L 语句。但是,这是什么意思?创建了四个新的滞后列,但这些变量中的单元格值是什么?
    • @RHelp:您确实需要发布完整的 SAS 代码(带有保留语句)。这取决于初始化 RETAIN 变量的值。以及在代码的后面部分如何分配。
    猜你喜欢
    • 2013-06-16
    • 1970-01-01
    • 2019-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多