这是我的输入:
ID Color 1 green 1 red 1 orange 1 green 1 red 2 red 2 red 2 blue 3 green 3 red
这是我在输出中想要的内容 - 每种颜色的ID记录计数:
ID green red orange blue 1 2 2 1 0 2 0 2 0 1 3 1 1 0 0
我知道我可以使用proc freq获取信息,但我想输出一个与我上面写的完全相同的数据集。我似乎无法弄清楚如何使颜色成为此输出数据集中的列。
答案 0 :(得分:5)
首先,生成数据。
data data;
format ID 8. Color $8.;
input id color;
datalines;
1 green
1 red
1 orange
1 green
1 red
2 red
2 red
2 blue
3 green
3 red
run;
接下来,按ID汇总颜色计数。
proc freq data=data noprint;
table id*color / out=freq;
run;
让桌子平整。
proc transpose data=freq out=freq_trans(drop=_:);
id color;
by id;
var count;
run;
可选地,用0填充缺失的单元格。
data freq_trans_filled;
set freq_trans;
array c(*) green red orange blue;
do i = 1 to dim(c);
if c[i]=. then c[i]=0;
end;
drop i;
run;
答案 1 :(得分:2)
您可以使用SPARSE
PROC FREQ
语句的TABLE
选项用零填充缺少的单元格。这样,您就不需要另一个DATA
步骤。颜色的顺序也可以通过ORDER=
的{{1}}选项来控制。
PROC FREQ
答案 2 :(得分:1)
我从未成为proc转置的粉丝,因为我永远不会记住语法。这是使用proc sql和宏变量的方法。
proc sql noprint;
select sum(color = '" || trim(color) || "') as " || color into: color_list separated by ", "
from (select distinct color from one);
create table result as
select id,
&color_list
from one
group by id;
quit;
id blue green orange red
1 0 2 1 2
2 1 0 0 2
3 0 1 0 1
答案 3 :(得分:0)
对于(pteranodon),我碰巧正在审阅档案(6年以后),这就是为什么如此不合时宜,但有人可能会受益。
proc sql noprint feedback;
select catx(' ','sum(color =',quote(trim(color)),') as',color) into: color_list separated by ", "
from (select distinct color from one);
create table result as
select id, &color_list
from one
group by id;
quit;