按条件垂直求和

时间:2014-09-03 20:03:11

标签: sas

我查看了之前的帖子(LINK)以获取可能的解决方案,但仍无效。我想使用ID作为公共标识符来跨行。 num变量是常量。 idcomp我要用来创建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;

2 个答案:

答案 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循环相当复杂,但在你的情况下它非常简单。