假设我有一个名为orig的数据,其变量为x和s,s为二进制,如下所示:
x s
12 1
3 0
3 0
34 1
12 0
我想创建一个类似于orig频率表的新表或数据。第一列将是x中出现的变量,第二列将是s变量的数量" 1"对于那些x,第三列将是" 0"最后一个将是x的总数。如果我们使用上面的表作为例子 我期待的新表是:
x "0 of s" "1 of s" total
3 1 1 2
12 1 1 2
34 0 1 1
答案 0 :(得分:2)
在proc sql
中非常简单明了。如果表达式为真,则使用group by
语句和sum
汇总函数评估为1
,如果表达式为真,则使用0
。
proc sql;
create table newtable as
select
x,
sum(s=0) '0 of s',
sum(s=1) '1 of s',
sum(1) as total
from orig
group by x;
quit;
答案 1 :(得分:1)
我认为这是你正在寻找的东西。对于你的x = 3输出,我认为你想要" 0的s" = 2," 1的s" = 0,但是,为了与原始数据集保持一致给。
data orig;
input x s;
datalines;
12 1
3 0
3 0
34 1
12 0
;
proc print data=orig;
title 'Original Dataset';
run;
proc sort data=orig;
by x;
run;
data orig_collapsed;
set orig;
retain s0 s1;
by x;
if first.x then do;
s0=0;
s1=0;
end;
if s=0 then s0=s0+1;
if s=1 then s1=s1+1;
if last.x then do;
total = s0 + s1;
output;
end;
keep x s0 s1 total;
run;
proc print data=orig_collapsed noobs;
title 'Collapsed Dataset';
run;