2014-08-30 103 views
0

我的公司剛剛從R切換到SAS,我正在將大量的R代碼轉換爲SAS。我在SAS中動態聲明變量(宏變量)時遇到了一個大問題。SAS動態聲明宏變量

例如,我的一個進程需要考慮列的平均值,然後在許多步驟中將其應用於整個代碼。

%let numm =0; 

我試過以下與我的numm變量,但這兩種方法不工作,我似乎無法找到任何聯機。

PROC MEANS DATA = ASSGN3.COMPLETE mean; 
#does not work 
&numm = VAR MNGPAY; 
run; 

Proc SQL; 
#does not work 
&numm =(Select avg(Payment) from CORP.INV); 
quit; 
+0

宏變量通常不應該存儲數據值。他們只是文字。除此之外,他們沒有數字精度的概念,所以在轉換爲宏變量時會失去精度。在很多方面SAS比SQL更像SQL;將你的意思存儲在數據集中。 – Joe 2014-08-30 16:04:49

+0

是的,我一定注意到SAS更像是一個可以執行統計的數據管理系統。對於高水平分析,R似乎更好。 – Chris 2014-08-30 18:32:33

+1

SAS的高級分析能力與R相當,而且對於某些事情來說速度要快很多。它不同,需要以不同的方式進行思考。你在做什麼就像在C中使用全局變量(或R,就此而言)在一個函數中;你不會在SAS中這樣做。然而,通過更簡單的方式,使用更多的慣用過程可以實現相同的結果。 – Joe 2014-08-30 20:33:11

回答

0

我強烈建議您購買一本關於SAS的書或從SAS培訓課程上課。 SAS編程II是一個很好的開始(編程I如果你還沒有編程任何其他的東西,但聽起來不是這樣)。你有的代碼表明你需要它。距離R.

也就是說一個完整的模式轉變,試試這個:

proc sql noprint; 
select mean(payment) into :numm from corp.inv; 
quit; 

%put The mean is: &numm; 
0

這裏的PROC彙總/數據步相當於:

proc summary data = corp.inv; 
    var payment; 
    output out = inv_summary mean=; 
run; 

data _null_; 
    set inv_summary; 
    call symput('numm',payment); 
run; 

%put The mean is: &numm; 

PROC SQL是一個更緊湊的方法,如果你只需要一個簡單的算術平均值,但是如果你需要更復雜的統計量,那麼使用proc總結是有意義的。