2016-07-18 20 views
0

これはいくつかのデータ例です。実際のデータはより複雑で、他のフィールドと約40000回の観測値と最大180個のid値を持ちます(転置テーブルでは360行ありますが、 )[OK]をthatsの:特定の方法でテーブルを転記する方法

Data have; 
input lastname firstname $ value; 
datalines; 
miller george 47 
miller george 45 
miller henry 44 
miller peter 45 
smith peter 42 
smith frank 46 
; 

run; 

と私はそれがこのように移調したいので、私は姓を持って、その後、姓に一致するerveryラインのためのFirstNameおよび値を交互に。

Lastname Firstname1 Value1 Firstname2 value2 Firstname3 Value3 firstname4 value4 
miller  george  47  george  45  henry  44  peter  45 
smith  peter  42  frank  46 

私はprocの転置とのビットを試してみましたが、私は上記の私はそれをしたい正確な方法を、テーブルを構築することができませんでした: データが欲しいです。私はちょうどその方法(実際のデータはより複雑で他のフィールドと同じです)が必要なテーブルを必要としますので、他のレイアウトのテーブルを作成することを提案してください。

+0

Googleのマクロは、データを反転/転置するより良い方法と呼ばれています。これは正確に設計されています。 – Reeza

答えて

4

proc summaryはこれを行うのに非常に有用な機能を持っています。idgroupあなたは姓ごとにいくつの値があるかを指定する必要があるので、最大数を計算するステップが含まれています。

Data have; 
input lastname $ firstname $ value; 
datalines; 
miller george 47 
miller george 45 
miller henry 44 
miller peter 45 
smith peter 42 
smith frank 46 
; 
run; 

/* get frequency count of lastnames */ 
proc freq data=have noprint order=freq; 
table lastname/out=name_freq; 
run; 

/* store maximum into a macro variable (first record will be the highest) */ 
data _null_; 
set name_freq (obs=1); 
call symput('max_num',count); 
run; 

%put &max_num.; 

/* transpose data using proc summary */ 
proc summary data=have nway; 
class lastname; 
output out=want (drop=_:) 
      idgroup(out[&max_num.] (firstname value)=)/autoname; 
run; 
+0

これまでこのソリューションをありがとうございました。私はそれに2つの問題しかありませんが、私はそれを回避することができると思います。 1. [number] numberは100に制限されています.'ERROR:パラメータ値178は1と100の必要な範囲にありません。私はより多くの値を持つIDをいくつか持っていますが、今はそれらを除外できます。 2.可変順序は 'fn1 fn2 ... fn100 value1 value2 ... value100'ですが、私はそれを扱うことができると思います... – kl78

関連する問題