使用 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;
我有一个看起来像这样的 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;