2016-07-22 6 views
3

다음 두 개의 데이터 세트가 있습니다. 나는 파일 B.에서의 아웃 기간 내에SAS - 다른 파일의 중간 기간을 기준으로 파일에서 행을 제거하십시오.

파일 검색

SEQ ID date var1 
1 A12 03JAN04 242 
2 A12 01FEB06 356 
3 A12 06JAN08 325 
4 A12 28DEC09 123 
5 B34 06MAY03 985 
6 B34 13JUN03 198 
7 B34 10MAY05 241 
8 C56 09NOV10 155 
9 C56 19OCT13 352 

파일 B

ID date_in date_out 
A12 01JAN04 04JAN04 
A12 05FEB08 08FEB08 
B34 03MAY03 06MAY03 
B34 09MAY05 19MAY05 
C56 12JUL12 18JUL12 

를 들어 폭포 날짜와에서 행을 삭제하려면 예를 들어 ID = A12의 경우 첫 번째 obs가 01JAN04-04JAN04에 속하므로 해당 obs는 삭제하지만 나머지는 보관하십시오.

기본적으로, 나는 다음과 같은 결과

SEQ ID date var1 
2 A12 01FEB06 356 
3 A12 06JAN08 325 
4 A12 28DEC09 123 
6 B34 13JUN03 198 
8 C56 09NOV10 155 
9 C56 19OCT13 352 

두 파일 A를 받아야하고 B는 ID 당 여러 레코드를 가지고 있으며, 파일 B에서의 제한 기간 사이가 항상 곁에 일정하지 않습니다.

내가 R에서 생각할 수있는 것은 아마도 A의 라인을 통해 루프를 작성할 수 있고, ID와 일치하는 B의 목록을 서브 세트로 작성한 다음 B의 해당리스트를 반복합니다. A의 날짜가 인라인 기간 사이.

하지만 SAS에서이 작업이 필요하므로 어디서부터 시작해야하는지 알 수 없습니다. SAS의 라인별로 어떻게 루프합니까? 예. 두 파일을 반복하는 매크로를 작성해야합니까? SQL을 어떻게 든 사용하십니까?

이 문제에 접근하는 방법에 대한 조언을 주시면 감사하겠습니다. 감사합니다.

답변

2

PROC SQL은 쉽게 그 돌봐 ...

proc sql; 
    create table bad_seqs as 
    select A.SEQ 
     from A 
     left join B 
      on A.ID = B.ID 
     where A.date between B.date_in and B.date_out; 

    delete from A where SEQ in (select SEQ from bad_seqs); 
quit; 
+0

매우 우아한 해결책을! 감사! – btiger

관련 문제