2016-11-24 3 views
-3

아래 조건에 따라 WHLDR 변수를 새로 만들어야합니다. 나는 마지막 것이 맞다면 확실하지 않다. 따라서 rel> 0이고 ref_1 = 1 인 경우 multi> 1이고 ref_1 = 0이면 whldr = 0이 아닌 경우이 조건을 충족하는 첫 번째 ID는 whldr = 1이고 계속됩니다. 아래 코드와 샘플 데이터입니다. 여기 첫 번째 함수 사용

data temp_all; 
    merge temp_1 (in=inA) 
     temp_2 (in=inB) 
     temp_3 (in=inC) 
    ; 
    by id; 
    firstid=first.id; 

    if multi = 1 then do; 
    if rel = 0 then whldr=1; 
    else whldr = 0; 
    end; 

    else if multi > 1 and ref_1 >= 1 then do; 
    if rel =0 and ref_1=1 then whldr=1; 
    else whldr = 0; 
    end; 

    else if multi > 1 and ref_1 = 0 then do; 
    if rel =0 and ref_1=1 then do; 
     if rel =0 and ref_0 ne '0' then do; 
     if first.id=1 then whldr=1 ; 
     else whldr=0; 
     end; 
    end; 
    end; 
run; 

샘플 데이터입니다 :

data have ; 
    input id a rel b multi ; 
cards; 
105 . 0 0 1 
110 1 0 1 1 
110 0 1 1 1 
110 . 2 1 1 
113 1 0 1 1 
113 2 1 1 1 
113 0 2 1 1 
113 0 2 1 1 
135 1 0 1 1 
135 0 1 1 1 
176 1 0 1 1 
176 0 1 1 1 
189 1 0 1 1 
189 2 1 1 1 
189 0 4 1 1 
189 0 4 1 1 
; 
+1

원하는 것을 더 자세히 설명해야합니다. 예를 들어 어떻게 사람을 정의하고 있습니까? 전체 데이터 세트에서 첫 번째 사람을 원하십니까? 또는 상태와 같은 다른 그룹화 변수 내에서? 입력 예제 및 결과 데이터를 게시하면 원하는 것을 명확히하는 데 도움이됩니다. – Tom

+0

그게 내 코드예요. 그 사람들은 whldr이고, 마지막 조건을 만족하는 전체 데이터 세트의 첫 번째 사람을 원합니다. 나는 사람 수준의 데이터를 가지고 있으며 그 조건을 충족시키는 첫 번째 사람 (B)을 얻으려고하고 있으며 결과는 가계 데이터 집합이 될 것입니다. – user601828

+0

복잡한 if/then 구조를 평가하여 원하는 정보가 없어도 정확한지 확인할 수 없습니다. 그러나 만약 당신이 관찰하고자하는 것을 표시했다면, 아마도 여러분은 하나의 관찰 결과 데이터 셋을 얻을 수 있도록'output;'과'stop; '문장을 추가 할 필요가있을 것입니다. – Tom

답변

1

당신이 WHLDR라는 변수가 있고 그 다음이 같은 데이터 단계를 실행할 수있는 값 1을 가진 첫 번째 관찰합니다.

data want ; 
    set have (obs=1); 
    where whldr=1 ; 
run; 
+0

if then else 문에서 조건을 기반으로 WHLDR 변수를 만듭니다. 따라서 WHLDR은 세 가지 조건에 따라 1 또는 0의 값을 얻습니다. – user601828

+0

첫 번째 레코드가 첫 번째 ID입니다. 위의 입력 데이터 세트에서 ID 103에는 세 개의 레코드가 있으므로 첫 번째 레코드는 위 코드의 마지막 else if 블록의 조건을 충족하면 whldr = 1이됩니다. – user601828

+0

113을 원하셨습니까? 중첩 된 IF 문에서 샘플 레코드를 전혀 사용하지 않는 방법은 모두 MULTI = 1이므로 FIRST.ID 플래그를 검사하는 코드 줄에 도달 할 수 있습니다. – Tom