使用 SAS 中值的频率将列转换为行矩阵 SQL

Convert column to row matrix with the frequency of its values in SAS SQL

我有一个看起来像这样的 table(使用 SAS SQL):

id 颜色
1 红色
2 蓝色
1 绿色
1 红色
2 红色
2 蓝色

我正在努力让它看起来像这样:

id 红色 蓝色 绿色
1 2 0 1
2 1 2 0

总而言之,我正在尝试将列转置为行,然后在单元格中具有每个 ID 每个类别出现的频率。

提前致谢!

第一次计数。然后转置。

proc freq data=have ;
  tables id*color / noprint out=counts;
run;
proc transpose data=counts out=want(drop=_name_ _label_);
  by id;
  id color;
  var count;
run;

如果将 SPARSE 选项添加到表语句中,您可以获得零而不是缺失。

tables id*color / noprint sparse out=counts;

使用proc sql,可以使用条件聚合:

proc sql;
    select id,
           sum(case when color = 'red' then 1 else 0 end) as red,
           sum(case when color = 'blue' then 1 else 0 end) as blue,
           sum(case when color = 'green' then 1 else 0 end) as green
    from t
    group by id;