2014-09-03 6 views
1

Я проверил это предыдущее сообщение (LINK) для потенциального решения, но все еще не работает. Я хочу суммировать строки, используя идентификатор, как общий идентификатор. Переменная 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 

Want:

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

One follow-up: Почему я теряю все переменные из набора данных, и вывод содержит только три из инструкции sql? – Jebediah15

+1

Поскольку оператор SQL определяет, какие переменные будут выводиться. Документация SAS PROC SQL неплоха с множеством соответствующих примеров. Так я преподавал сам синтаксис SQL. – DomPazz

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 довольно сложный, но в вашем случае это довольно просто.