我查看了之前的帖子(LINK)以获取可能的解决方案,但仍无效。我想使用ID作为公共标识符来跨行。 num
变量是常量。 id
和comp
我要用来创建pct
变量的两个变量,其中= [comp
= 1] / num
的总和
有:
id Comp Num
1 1 2
2 0 3
3 1 1
2 1 3
1 1 2
2 1 3
想要:
id tot pct
1 2 100
2 3 0.666666667
3 1 100
目前有:
proc sort data=have;
by id;
run;
data want;
retain tot 0;
set have;
by id;
if first.id then do;
tot = 0;
end;
if comp in (1) then tot + 1;
else tot + 0;
if last.id;
pct = tot / num;
keep id tot pct;
output;
run;
答案 0 :(得分:4)
我使用SQL来做这样的事情。您可以在数据步骤中执行此操作,但SQL更紧凑。
data have;
input id Comp Num;
datalines;
1 1 2
2 0 3
3 1 1
2 1 3
1 1 2
2 1 3
;
run;
proc sql noprint;
create table want as
select id,
sum(comp) as tot,
sum(comp)/count(id) as pct
from have
group by id;
quit;
答案 1 :(得分:0)
嗨,您的问题有一个更优雅的解决方案:)
proc sort data = have;
by id;
run;
data want;
do _n_ = 1 by 1 until (last.id);
set have ;
by id ;
tot = sum (tot, comp) ;
end ;
pct = tot / num ;
run;
我希望很清楚。我也使用sql,因为我是新手,DOW循环相当复杂,但在你的情况下它非常简单。