我有两个患者数据集,我正在尝试制作一个数据; 我在住院病人入院时的第一个数据,第二个是门诊就诊。我想比较两个数据集,看看门诊病人的访问数据是否有患者,然后我想在住院患者数据中添加一个新变量,让我们说OP_var并将其标记为“是”,如果住院患者数据中没有住院患者数据患者那么我想将OP_var标记为“否”。
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`
答案 0 :(得分: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;
只适用于一个合并变量(没有愚蠢的技巧,比如一起捕捉值)。
如果这两个对您不起作用,还有其他解决方案 - 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;
答案 1 :(得分:1)
这应该会有所帮助。对不起,大约一年前我换了R,不再在我的电脑上安装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;