2014-09-03 5 views
1

잠재적 인 솔루션에 대해서는이 이전 게시물 (LINK)을 체크 아웃했지만 여전히 작동하지 않습니다. ID를 공통 식별자로 사용하여 행 전체를 합산하려고합니다. 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 

I 원하는 idcomp 두 변수 [comp = 1]의 합 = A pct 변수/num

가지고를 creat에 데 사용할 현재 보유 :

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 문의 3 개만 포함되어 있습니까? – 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; 

있다. 나는 새롭고 DOW 루프가 다소 복잡하지만 당신의 경우에는 매우 간단하기 때문에 SQL을 사용한다.