如何以特定方式转换表

时间:2016-07-18 10:07:58

标签: sas

这是一些示例数据,实际数据更复杂,其他字段和大约40000个观察值以及每个id最多180个值(我知道我将在转置表中获得360行,但没关系):

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;

我希望它以这种方式进行转置,所以我有姓氏,然后交替使用姓氏和值来匹配姓氏。 数据想要:

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

我尝试了proc转置,但我无法按照我想要的方式构建一个表,如上所述。我需要那种想要的表(真实数据更复杂,并且与其他字段一样),所以请不要提出用其他布局创建需要表的答案。

1 个答案:

答案 0 :(得分: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;