2014-01-29 85 views
2

我目前在SAS脚本转换为R.工作,我是比较新的SAS,我有一个很难理解下面的语句 -SAS宏R%sysfunc

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用于用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或数据集来尝试并检查结果。任何对此的帮助都会很大。谢谢!

回答

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的equvialent将是以下:

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

第二vars_l宏分配仅将lag_添加到VARS宏变量中的每个空格分隔值的开头。由于第一个值不以空格开头,如果你将得到下面的存储在vars_l的%let vars_l = lag_%sysfunc(tranwrd(&vars,%str(),%str(lag_)));开始时省略lag_date lag_id lag_sales lag_units

从代码中,我可以看到有没有建立,只是还没有变数,但你应该在后面找到一个data step。在评论中提到的RETAIN声明就是这样。

+0

是。以下几行有合并命令和** RETAIN VARS_L **语句。但是,这是什么意思?创建了四个新的滞后列,但这些变量中的单元格值是多少? – RHelp

+0

@RHelp:您确实需要发布完整的SAS代码(使用retain语句)。这取决于RETAIN变量初始化的值是什么。以及代码的后面部分如何进行分配。 – 2014-01-29 12:14:33