2017-04-14 39 views
1

刪除缺失觀察我有反覆觀察的數據集(例如,在5周的觀察結果)移調過程,而在SAS

也有多個行每個個體(未每個人都一樣)

ID val1 val2 val3 val4 val5 
1 0 0 1 1 1 
1 . . 2 2 2 
2 1 1 1 . . 
2 2 2 2 . . 
3 1 1 . . . 

步驟1 :我申請移調過程

proc transpose data=original out=tranposed; 
by ID; var val1-val&_valcount; /* in this example &_valcount = 5 */ 
run;  

ID val col1 col2 
1 val1 0 . 
1 val2 0 . 
1 val3 1 2 
1 val4 1 2 
1 val5 1 2 
2 val1 1 2 
2 val2 1 2 
2 val3 1 2 
2 val4 . . 
2 val5 . . 
3 val1 1 . 
3 val2 1 . 
3 val3 . . 
3 val4 . . 
3 val5 . . 

步驟2:nmiss()與缺失值僅

刪除行
data transposed; set transposed; 
if nmiss(of _numeric_) EQ &_repeatcount then delete; 
/* in this example &_repeatcount = 2 */ 
run; 

ID val col1 col2 
1 val1 0 . 
1 val2 0 . 
1 val3 1 2 
1 val4 1 2 
1 val5 1 2 
2 val1 1 2 
2 val2 1 2 
2 val3 1 2 
3 val1 1 . 
3 val2 1 . 

由於原始數據集大,調換數據集的大小是非常大的,它需要很長的計算時間去換位數據集。

是否有任何方法來步驟1 &步驟2組合成單個步驟,如刪除觀測而轉置數據集,以節省存儲和時間?

+0

你提前知道了 「repeatcount」?每個小組都一樣嗎? – Tom

+0

是的,我提前知道「重複計數」。每個小組都不一樣。我只知道,「最大」 repeatcount – jaerung

+0

不應該有辦法做到這一點使用數據集選項 - 在哪裏? – Reeza

回答

0

所以如果你知道每個ID組和您想要的變量(列)的若干意見(行)的最大數量轉

%let maxrows=2; 
%let maxcols=5; 
%let incols=val1-val5 ; 
%let outcols=col1-col&maxrows; 

然後你可以使用一個臨時數組來存儲所有的值爲一個ID組,然後輸出它。

data want ; 
    array storage (&maxrows,&maxcols) _temporary_; 
    do n=1 by 1 until (last.id); 
    set have; 
    by id ; 
    array inx &incols; 
    do j=1 to dim(inx); 
     storage(n,j)=inx(j); 
    end; 
    end; 
    length _name_ $32 ; 
    array out &outcols; 
    do row=1 to dim(inx); 
    _name_ = vname(inx(row)); 
    do col=1 to n; 
     out(col) = storage(col,row); 
    end; 
    if n(of out(*)) then output; 
    end; 
    keep id _name_ &outcols; 
run; 
+0

謝謝Tom!有用! :) – jaerung