在SAS中汇总数据

时间:2016-02-19 16:56:45

标签: sas

这是我的数据:

data example;
   input id sports_name;
   datalines;
   1 baseball
   1 basketball
   1 cricket
   1 soccer
   2 golf
   2 fencing

这只是一个样本。变量sports_name是56种类型的分类。 我试图将数据转换为宽格式,其中每一行都有一个user_id,sports的名称作为变量,值为1/0表示存在或不存在。

到目前为止,我使用proc freq过程来获取交叉列表频率表并将其放在不同的数据集中,然后转换该数据。现在我在某些情况下缺少值,并在其余情况下计算运动数量。

有没有更好的方法呢?

谢谢!

2 个答案:

答案 0 :(得分:0)

你需要一种从无到有创造东西的方法。您也可以在PROC FREQ中使用SPARSE选项。 SAS名称的长度不能超过32。

data example;
   input id sports_name :$16.;
   retain y 1;
   datalines;
   1 baseball
   1 basketball
   1 cricket
   1 soccer
   2 golf
   2 fencing
;;;;
   run;
proc print;
   run;
proc summary data=example nway completetypes;
   class id sports_name;
   output out=freq(drop=_type_);
   run;
proc print;
   run;
proc transpose data=freq out=wide(drop=_name_);
   by id;
   var _freq_;
   id sports_name;
   run;
proc print;
   run;

enter image description here

答案 1 :(得分:0)

这里的理论相同,使用SQL而不是Proc Summary生成所有可能组合的列表,然后转置结果。

data example;
informat sports_name $20.;
   input id sports_name $;
   datalines;
   1 baseball
   1 basketball
   1 cricket
   1 soccer
   2 golf
   2 fencing
;
run;

proc sql;
create table complete as
select a.id, a_x.sports_name, case when not missing(e.sports_name) then 1 else 0 end as Present
from (select distinct ID from example) a
cross join (select distinct sports_name from example) a_x
full join example as e
on e.id=a.id
and e.sports_name=a_x.sports_name;
quit;

proc transpose data=complete out=want;
by id;
id sports_name;
var Present;
run;