我目前正致力于将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_)));
这里,date,id等都是我当前数据集中的变量。我理解函数 tranwrd 用于将值替换为Character变量中的另一个值。在这种情况下,它会创建新项目 -
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或数据集来尝试检查结果。对此的任何帮助都会很棒。谢谢!
答案 0 :(得分:4)
以下代码基本上是创建宏变量来保存要处理的变量列表。 (注意: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_)));
如果您运行以下代码(要查看VARS
& vars_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
宏变量中每个空格分隔值的开头。由于第一个值不是以空格开头,如果您在lag_
开头省略%let vars_l = lag_%sysfunc(tranwrd(&vars,%str( ),%str( lag_)));
,则会在vars_l中存储以下内容:date lag_id lag_sales lag_units
从代码我可以看到还没有创建变量,但是你应该稍后找到data step
。评论中提到RETAIN
陈述就是这样。