我想问一个关于SAS编程的复杂(对我而言)问题。我想通过使用简单的例子我可以更好地解释。所以,我有以下数据集:
Group Category
A 1
A 1
A 2
A 1
A 2
A 3
B 1
B 2
B 2
B 1
B 3
B 2
我想计算每个组的每个类别。我可以使用PROC FREQ来做到这一点。但这对我的数据集来说并不是更好的方法。这对我来说很耗时,因为我的数据集太大而我拥有大量的群组。因此,如果我使用PROC FREQ,首先我需要为每个组创建新的数据集,然后为每个组使用PROC FREQ。总而言之,我需要创建以下数据集:
CATEGORIES
Group 1 (first category) 2 3
A 3 2 1
B 2 3 1
因此,A组中第一类的数量为3.B组中第一类的数量为2,依此类推。我想我可以解释一下。谢谢你的帮助。
答案 0 :(得分:1)
SAS中有多种方法可以做到这一点。我的偏见是proc sql
,所以:
proc sql;
select grp,
sum(case when category = 1 then 1 else 0 end) as cat_1,
sum(case when category = 2 then 1 else 0 end) as cat_2,
sum(case when category = 3 then 1 else 0 end) as cat_3
from t
group by grp;
答案 1 :(得分:0)
proc freq
或proc summary
可以完成生成频率计数的工作:
data example;
length group category $1;
input group category;
cards;
A 1
A 1
A 2
A 1
A 2
A 3
B 1
B 2
B 2
B 1
B 3
B 2
;
run;
proc freq data=example;
table group*category;
run;
proc summary data=example nway;
class group category;
output out=example_frequency (drop=_type_);
run;
proc summary
将生成一个“长”的数据集。格式。如果您需要转置它(我建议不这样做:您可能会发现在大多数情况下更容易使用长格式),您可以使用proc transpose
:
proc transpose data=example_frequency out=example_matrix (drop=_name_);
by group;
id category;
var _freq_;
run;