2013-06-19 256 views
2

我對SAS編程環境非常熟悉。我目前正在嘗試學習編程R.我發現使用SAS宏可以減少編程中重複代碼的數量。特別是,我使用宏變量找到了有用的數據集名稱和變量名稱調整部分。但是,在R中我還沒有找到可以複製這個的東西。SAS中的宏變量R

例如,在SAS I可以寫一個簡單的宏上運行兩個數據集這樣PROC意味着:

%macro means(dataset_suffix = , var1_suffix=); 
proc means data = data&dataset_suffix; 
var var1&var1_suffix; 
run; 
%mend means; 
%means(dataset_suffix = _suf1, var1_suffix = _suf2); 
%means(dataset_suffix = _suf3, var1_suffix = _suf4); 

運行代碼執行得到的在下面的代碼宏兩次正在運行

proc means data = data_suf1; 
var var_suf2; 
run; 
proc means data = data_suf3; 
var var_suf4; 
run; 

我已經看過R的用戶定義函數以及使用列表。我知道R中沒有一個過程可以與proc方法直接比較。但是,我的問題的焦點是如何使用宏變量來引用R中具有相似前綴但不同後綴的不同對象。我也考慮過使用粘貼功能。任何與此有關的幫助將不勝感激。

+1

我會看看數據框的'names'屬性 - 如果你做了'names(data)< - paste0(「suffix」,names(data2))''它應該達到你之後。 –

+0

謝謝你的這個想法。我會研究它。 – user1500158

回答

6

它總是需要一些調整來自宏大的語言(SAS或Stata)到一個具有實際變量(R)的語言。最後,你會發現真正的變量更強大,而且更不容易出錯。

幾乎所有在R是一流的對象。一個list可以存儲任何對象。這意味着您可以擁有模型對象列表data.frames,無論您想要什麼。

datasets <- list(one=data.frame(x=runif(100),y=runif(100)), two=data.frame(x=runif(100),y=runif(100))) 
lm(y~x, data=datasets$one) 
modelList <- lapply(datasets, function(dat) lm(y~x, data=dat)) 

返回模型結果的列表:

> modelList 
$one 

Call: 
lm(formula = y ~ x, data = dat) 

Coefficients: 
(Intercept)   x 
    0.46483  0.06038 


$two 

Call: 
lm(formula = y ~ x, data = dat) 

Coefficients: 
(Intercept)   x 
    0.48379  0.00948 

然後你就可以操作上:

sapply(modelList,coef) 
        one   two 
(Intercept) 0.46482610 0.483785135 
x   0.06038169 0.009480099 

開始看到電源了嗎? :-)

你可以用循環做同樣的事情,但*apply命令爲你節省了很多簿記代碼。

+0

感謝您向我介紹* apply命令。我很高興能夠更多地瞭解它們。 – user1500158

+1

正確使用的SAS不是繁重的語言;) – Joe

+1

不客氣。 *應用命令是R的美麗真正開始的地方。 @Joe有沒有適當的方法來使用SAS? :-) –