这是我的数据:
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过程来获取交叉列表频率表并将其放在不同的数据集中,然后转换该数据。现在我在某些情况下缺少值,并在其余情况下计算运动数量。
有没有更好的方法呢?
谢谢!
答案 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;
答案 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;