enter image description here我正在努力寻找身份证明的人,他们在住院日期之前连续12个月入学,在住院日期之后又过了12个月。每个成员都有一行。 这是在美国使用索赔数据库。任何帮助表示赞赏。 数据集示例: ID Enr_date End_Date hosp_date 1 1/5/2004 1/6/2008 2/2/2006 2 ....等等 3 4 id start_e end_e date_h 1 1/1/2005 1/1/2006 2/8/2008 1 2/3/2006 4/5/2013 2 5/7/2005 8/8/2006 4/5/2007 2 1/1/2007 2/2/2012 3 5/9/2005 5/9/2007 1/1/2007 3 6/4/2008 7/7/2012
答案 0 :(得分:0)
假设我的上一篇评论有答案,有很多方法可以做到这一点。开始时可能很难以易于理解的方式获得外连接,交叉连接等工作。使用SAS宏,我们可以解决问题,因此很容易理解并进行可能需要的任何调试。这是一种可能适合您的方法:
%macro hdates;
/* get number of hosp_dates */
proc sql noprint;
select count(*) into: cnt
from date where hosp_date ne .;
quit;
%let cnt = &cnt;
/* place hdates and ids into macro vars */
proc sql noprint;
select enrolid, hosp_date into: id_1 - :id_&cnt, : hdate_1 - :hdate_&cnt
from date;
quit;
proc delete data= hcov; run;
/* for each hdate id pair go through the dataset and test for 12 mo coverage
%do i = 1 %to &cnt;
data new;
set date;
if (enrolid = &&id_&i) then do;
preDays = "&&hdate_&i"d - start_date ;
postDays = end_date - "&&hdate_&i"d;
if (preDays >= 365 and postDays >= 365) then output;
end;
run;
proc append base = hcov data=new;run;
%end;
%mend hdates;
%hdates;
答案 1 :(得分:0)
我处理索赔数据,我想我明白你要问的是什么。我建议使用"浓缩"制作一张桌子。入学范围和另一个住院日期。然后您可以将它们合并在一起,只保留那些符合您标准的患者。以下代码将压缩注册范围(假设记录良好):
PROC SORT DATA=dset_in; BY id enr_date end_date; RUN;
DATA enrollment (KEEP=id enroll_start enroll_stop);
SET dset_in;
FORMAT enroll_start enroll_stop DATE9.;
BY id enr_date end_date;
RETAIN enroll_start enroll_stop;
IF first.id THEN DO;
enroll_start=enr_date;
enroll_stop=end_date;
END;
ELSE IF enr_date-enroll_stop <= 1 THEN enroll_stop=end_date;
ELSE DO;
OUTPUT;
enroll_start=enr_date;
enroll_stop=end_date;
END;
IF last.id THEN OUTPUT;
RUN;
然后,此代码将仅保留那些住院前和入组前后365天的患者。如果hosp_claims数据集每位患者住院次数超过1次,则在此步骤后排序,然后按照每个ID的第一个障碍:
PROC SQL;
CREATE TABLE hosp_enrolled AS
SELECT DISTINCT a.id, a.hosp_dt, b.enroll_start, b.enroll_stop
FROM hosp_claims AS a, enrollment AS b
WHERE a.id=b.id AND b.enroll_start+365 <= a.hosp_dt <= enroll_stop-365;
QUIT;