2014-01-29 104 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