2016-10-14 8 views
0

SAS Enterprise Guideに次のようなデータセットがあります。条件を使用してSASデータセットを変更する

ID |年|エンティティ| Inv1 | Inv2 | Inv3 | Inv4 | Inv5
1 | 2015年| | 2 | 3 | 。 | 5 | 。
1 | 2016年| | 。 | 2 | 3 | 。 | 。
2 | 2015年| B | 1 | 。 | 3 | 。 | 4
3 | 2016年| C | 。 | 2 | 。 | 3 | 。
2 | 2016年| B | 5 | 。 | 。 | 2 |。
3 | 2015年| C | 。 | 1 | 。 | | 3

とそれに変換したい:

ID |年|エンティティ| Inv |値
1 | 2015年| | Inv1 | 2
1 | 2015年| | Inv2 | 3
1 | 2015年| | Inv4 | 5
1 | 2016年| | Inv2 | 2
1 | 2016年| | Inv3 | 3
2 | 2015年| B | Inv1 | 1
2 | 2015年| B | Inv3 | 3
2 | 2015年| B | Inv5 | 4
3 | 2016年| C | Inv2 | 2
3 | 2016年| C | Inv4 | 3
2 | 2016年| B | Inv1 | 5
2 | 2016年| B | Inv4 | 2
3 | 2015年| C | Inv2 | 1
3 | 2015年| C | Inv5 | 3

私はインターネットで検索しましたが、私はこれを思いついた:http://support.sas.com/kb/24/635.htmlしかし、私の問題は余分な次元があり、私は立ち往生しています。どんな助けでも大歓迎です!

+0

EGにはトランスポーズタスクがあります。 – Reeza

答えて

1

これは単純な転置です。

まず、あなたのデータをソート:

proc sort data=have; 
by id year entity; 
run; 

その後移調します。あなたは、列の名前を変更し、欠損値を除外します:

proc transpose data=have out=want(where=(value1^=.)) name=Inv prefix=Value; 
by id year entity; 
var inv:; 
run; 

Proc TransposeValue1として変数を作成します、あなたが欲しい場合は、その名前を変更することができます。

proc datasets lib=work nolist; 
modify want; 
    rename Value1=Value; 
run; 
quit; 
+0

OUT = WANTの場合、データセット名を変更することもできます。 –

+0

素晴らしい!どうもありがとう。これはすごくうまくいった。 – sonarclick

0

配列を作成して使用するには、変数invを反復処理する必要があります。

data result; 
    set source; 

    array inv_tab(*) inv1-inv5; 

    do i = 1 to dim(inv_tab); 
     if inv_tab(i) ^= . then do; 
      inv = vname(inv_tab(i)); 
      value = inv_tab(i); 
      output; 
     end; 
    end; 

    drop i inv1-inv5; 
run; 
+0

ありがとうRobert。これも機能します。 – sonarclick

0

EGでは、トランスポーズタスクを使用することもできます。

INV変数をTRANSPOSE変数の下に置きます。 GROUP BY変数の下にID YEAR ENTITYを配置します。

[結果]オプションで出力データセット名をカスタマイズできます。

関連する問題