2017-04-09 22 views
0

我有一個數據集,看起來像這樣:SAS - 從廣角轉換數據集高大使用數組

OBS  S1 S2 S3 
before 10 15 13 
after 5 7 8 

我試圖使用數組在SAS將其轉換爲看起來像這樣的表:

SUBJ BEFORE AFTER 
1  10  5 
2  15  7 
3  13  8 

我還是SAS的新手。我想,我需要建立一個具有形式的2x3陣列:

10 15 13 
5 7 8 

然後循環,但並分配值。

這是我迄今爲止,但它僅捕獲原始表的第一行:

DATA tall; 
    input obs $ score1-score3; 

    array rowscores(3) score1-score3; 
    array allscores(2,3) _TEMPORARY_; 

    do i=1 to 2; 
    do j=1 to 3; 
     allscores(i,j) = rowscores(j); 
    end; 
    end; 

    do k=1 to 3; 
    subj = k; 
    before = allscores(1,k); 
    after = allscores(2,k); 
    output; 
    end; 

    keep subj before after; 

    DATALINES; 
before 10 15 13 
after 5 7 8 
; 
RUN; 

我缺少什麼?謝謝你的幫助!

+0

SAS一次只處理一行,而數組只是變量的快捷方式。這個解決方案取決於你知道數據的結構,在這一點你也可以輸出新的數據集。在這種情況下,使用PROC TRANSPOSE而不是數組方法會更有效。 – Reeza

回答

1

對於您的數據步驟工作,您需要將您的INPUT語句移到您的第一個DO循環中。

要以這種方式進行這種轉換,您需要在編譯數據步驟之前知道很多關於數據的信息。我想你需要知道這個信息:

%let ncols=3 ; 
%let nrows=2 ; 
%let have_cols = s1-s3 ; 
%let want_cols = before after ; 

所以,如果你是知道的信息,那麼你可以閱讀整個數據集到一個臨時數組,然後當你到最後它寫回。

data want ; 
    set have end=eof; 
    array storage (&nrows,&ncols) _temporary_; 
    array cols &have_cols ; 
    do i=1 to &ncols; 
    storage(_n_,i)=cols(i) ; 
    end; 
    if eof then do; 
    do subj=1 to &ncols; 
     do j=1 to &nrows; 
     array want &want_cols ; 
     want(j) = storage(j,subj); 
     end; 
     output; 
    end; 
    end; 
    keep subj &want_cols ; 
run; 

僅僅使用PROC TRANSPOSE可能容易得多。

proc transpose data=have out=want ; 
    var s1-s3 ; 
    id obs ; 
run; 

然後,您可以將_NAME_變量更改爲您的SUBJ變量或僅生成一個變量。

data want; 
    subj+1; 
    set want; 
run; 
+0

謝謝。它看起來像'PROC TRANSPOSE'是這個方法。 – waealu