2017-04-14 22 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もあります:欠損値のみ

で行を削除するnmiss():私は手順に

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をトランスポーズ適用します

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

"繰り返し回数"を事前に知っていますか?それはすべてのグループで同じですか? – Tom

+0

はい私は "repeatcount"を事前に知っています。すべてのグループで同じではありません。私はちょうど '最大'リピート数を知っています – jaerung

+0

データセットオプションを使用してこれを行う方法はありません - どこですか? – Reeza

答えて

0

あなたは

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

を移調するIDグループおよび変数(列)の数ご希望あたりの観測(行)の最大数を知っているなら、あなたはすべての値を保存するために一時的な配列を使用することができますので、 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