2016-11-09 25 views
0

當您有像表一樣的表格時;在SAS中創建帶有循環的表格

somefield1 somefield2 lastterm1 lastterm2
(10)(20)(1)( - )
(20)(40)(1)(2)
(30)(50)( - )(2)

並嘗試爲每個術語進行分組,有沒有更容易的方法來做到這一點,而不是;

PROC SQL; 
    CREATE TABLE WORK.LAST_TERM1 AS 
    SELECT T1.LASTTERM1, 
    (MEAN(t1.'somefield1'n)) FORMAT=COMMAX14.2 AS 'MEAN_of_somefield1'n, 
    (MEAN(t1.'somefield2'n)) FORMAT=COMMAX14.2 AS 'MEAN_of_somefield2'n 

    FROM WORK.MAIN_TABLE t1 
GROUP BY t1.LASTTERM1; 
RUN; 
PROC SQL; 
    CREATE TABLE WORK.LAST_TERM2 AS 
    SELECT T1.LASTTERM2, 
    (MEAN(t1.'somefield1'n)) FORMAT=COMMAX14.2 AS 'MEAN_of_somefield1'n, 
    (MEAN(t1.'somefield2'n)) FORMAT=COMMAX14.2 AS 'MEAN_of_somefield2'n 

    FROM WORK.MAIN_TABLE t1 
GROUP BY t1.LASTTERM2; 
RUN; 

這不是兩個字段和兩個方面的問題,但是當你有20個條款和200場這個代碼是不是有效。

我試過並沒有做到像1到20這樣的事情,並創建所有表。

有沒有辦法做到這一點?

回答

0

我認爲你正在尋找proc的手段。您可以使用sas-macro替換輸出表和類變量的名稱來循環訪問分組變量列表(即lastterm1,lastterm2),並且應該包含您需要的所有內容。

這是一個簡單的宏,它將爲last_term1 - last_term20執行此操作。它有點不清楚你想要什麼,所以這是一個基本的概括形式。

%macro looper(); 
%do i = 1 %to 20; 
    proc means data=WORK.MAIN_TABLE; 
    var somefield1 somefield2; 
    class lastterm&i.; 
    output out=WORK.LAST_TERM&i. 
     mean(somefield1) = MEAN_of_somefield1 
     mean(somefield2) = MEAN_of_somefield2; 
    run; 
%end; 
%mend; 
%looper(); 
+0

其實我問的是如何做sas宏可以代替輸出表名和類變量。那是我失敗的地方。應該這樣做,因爲它們按順序遞增,就像「lastterm(n)」,「lastterm(n + 1)」... ... – kutayatesoglu

+0

這個宏完全是我在找的東西。謝謝您的幫助 :) – kutayatesoglu