2017-10-31 5 views
0

データを使用してデータを長い形式から広い形式に変換したい。問題は、欠損値のために値が正しいセルに配置されないということです。私は欠けている値のプレースホルダを含める必要がある問題を解決すると思います。データを使用してデータが欠落しているSAS/Long to Wide

問題はどのように行うのかわかりません。誰かが私にそれについて行く方法のヒントを教えてくださいできますか?

data tic; 

input id country$ month math; 

datalines; 
1 uk 1 10 
1 uk 2 15 
1 uk 3 24 
2 us 2 15 
2 us 4 12 
3 fl 1 15 
3 fl 2 16 
3 fl 3 17 
3 fl 4 15 
; 
run; 

proc sort data=tic; 
by id; 
run; 


data tot(drop=month math); 
retain month1-month4 math1-math4; 
array tat{4} month1-month4; 
array kat{4} math1-math4; 
set tic; 

by id; 

if first.id then do; 
    i=1; 
    do j=1 to 4; 
     tat{j}=.; 
     kat{j}=.; 
    end; 
end; 

tat(i)=month; 
kat(i)=math; 

if last.id then output; 

i+1; 

run; 

編集 私は最終的に、問題が何であるかを考え出し:

はにコード

tat(i)=month; 
kat(i)=math; 

のこの行を変更:

tat(month)=month; 
kat(month)=math; 

、それは問題を修正しました。

+0

データをどのように表示するかの例を追加できますか?私はあなたが探しているものを理解していない。 – DomPazz

答えて

0

高さとスキニーのデータ変換は、しばしばカテゴリデータが列名として終わることを意味します。これは、データをメタデータに移動するプロセスです。これは、後でBYまたはCLASSグループを処理する際に問題になる可能性があります。

SASには、ピボット出力を作成するためのProc TABULATEとProc REPORTがあります。 Proc TRANSPOSEはピボットされたデータを作成するのにも適した標準的な方法です。

2つの列を一度にピボットすることに気付きました。 TRANSPOSEはマルチピボットできません。あなたが示したDATA Stepアプローチは、インデックスが既知の範囲内にあるときにトランスポーズ変換を行う典型的な方法です。あなたのケースでは、配列宣言は、インデックスを介した '直接アドレス指定'がすべてのデータにわたって発生する最小値と最大値を処理できるようにする必要があります。

関連する問題