2014-09-03 55 views
1

我查看了此前的帖子(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; 

回答

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; 
+0

一次後續操作:爲什麼我會丟失有數據集中的所有變量,並且輸出只包含sql語句中的三個變量? – Jebediah15 2014-09-03 21:20:54

+1

由於SQL語句定義將輸出哪些變量。 SAS文檔PROC SQL相當不錯,有很多相關的例子。這就是我自學SQL語法的方式。 – DomPazz 2014-09-03 22:23:26

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循環相當複雜,但在你的情況下它非常簡單。