2013-08-22 4 views
2

두 개의 데이터 세트가 있는데 하나의 데이터를 만들려고합니다. 내 첫 입원 환자 데이터, 두 번째는 외래 방문입니다. 두 가지 데이터 세트를 비교하여 외래 환자 방문 데이터에 환자가 있는지 알아보고 입원 환자 데이터에 새 변수를 추가하고 OP_var를 "예"라고 표시하고 입원 환자 데이터 환자가 외래 환자 데이터에 없다면 나는 OP_var를 "No"라고 표시하고 싶습니다.SAS - 두 개의 데이터 세트에서 두 변수를 비교하십시오.

e.g.`

data inpatient; 
input PID adm_dt dis_dt hsp_id @@; 
cards; 
1 01/01/2013 01/03/2013 10001 
2 01/03/2013 01/04/2013 10110 
3 01/10/2012 01/12/2012 10010 
4 01/11/2013 01/17/2013 10000 
;; 

data outpatient; 
input PID adm_dt_op dis_dt_op hsp_id_op @@; 
cards; 
1 01/05/2013 01/05/2013 10000 
2 01/06/2013 01/06/2013 10111 
4 01/19/2013 01/19/2013 10001 
;; 

data want; 

PID adm_dt  dis_dt  hsp_id adm_dt_op dis_dt_op hs_id_op OP 
1 01/01/2013 01/03/2013 10001 01/05/2013 01/05/2013 10000 Yes 
2 01/03/2013 01/04/2013 10110 01/06/2013 01/06/2013 10111 Yes 
3 01/10/2012 01/12/2012 10010 .   .   .  No 
4 01/11/2013 01/17/2013 10000 01/19/2013 01/19/2013 10001 Yes` 

답변

1

이 도움이 될 것이다. 미안 R에 1 년 전에 전환하고 내 PC에 SAS를 더 이상 테스트하지 않아.

PROC SQL; 
    CREATE TABLE Patient_Matches AS 
    SELECT * 
    FROM inpatient left join outpatient 
    ON inpatient.PID = outpatient.PID 
    ; 
    QUIT; 


    PROC SQL; 
     ALTER TABLE Patient_Matches ADD OPchar(2); 
     UPDATE Patient_MatchesSET myString='NO' where hs_id_op = ''; 
     UPDATE Patient_MatchesSET myString='YES' where hs_id_op <> ''; 
    quit; 
+0

두 데이터 집합 사이에서 PID를 비교하고 OP 변수에 예 또는 아니오로 레이블을 지정하려고합니다. – user877204

+0

이 방법이 효과가 있습니까? – user2600629

+0

그건 과도한 행동입니다. 그는 외래 환자를 필요로하지 않으며 결국 CASE를 사용하여 선택에서 예/아니오를 모두 할 수 있습니다. – Joe

3

아주 기본적인 문제에 대한 해결책이 많습니다. 두 데이터 세트를 병합 : 당신이 병합 할 여러 변수를 경우에도 작동

data want; 
merge inpatient(in=i) outpatient(in=o keep=PID); 
if i; 
if o then Outpatient='Yes'; 
else outpatient='No'; 
run; 
가 매우 큰 데이터 세트에 대한 느린 할 수 있도록 일종의을 필요로 않습니다.

는 형식을 만듭니다

data op_format; 
start=pid; 
label='Yes'; 
fmtname='Outpf'; 
output; 
if _n_ = 1 then do; *add a row that instructs it what to do with nonmatching records; 
hlo='o'; 
label='No'; 
output; 
end; 
run; 

proc format cntlin=op_format; 
quit; 

data want; 
set inpatient; 
outpatient=put(pid,outpf.); 
run; 

만 (함께 값을 catting 바보 같은 트릭없이) 하나 개의 병합 변수로 작동합니다.

: 대략, 데이터에 따라, 등 다양한 것들과의 친숙 함,

SQL 솔루션 등 SQL, 해시 테이블, -이 두 당신을 위해 작동하지 않는 경우

는 다른 솔루션이 있습니다

proc sql; 
create table want as 
    select I.*, case when missing(O.PID) then 'No' else 'Yes' end as OP 
    from inpatient I left join outpatient O 
    on I.pid=O.pid; 
quit; 
+0

감사합니다. 병합 옵션이이 경우 작동하지만 큰 데이터 세트 정렬로 인해 시간이 좀 걸릴 수 있습니다. PROC SQL에서 이와 같은 작업을 수행 할 수 있습니까? – user877204

+0

SQL은 여전히 ​​어떤 방식으로 정렬을 수행해야합니다. 마술처럼 레코드를 결합 할 수있는 것과는 다릅니다 :) 해시 테이블을 사용하면 더 빨리 수행 할 수 있지만 PID가 상당히 고유한지 여부는 알 수 없습니다. – Joe

관련 문제