Date 注册日期特定日期前后12个月
我试图通过id查找在住院日期前12个月和住院日期后12个月连续注册的人员。每个成员将有一行。 这是在美国使用索赔数据库。感谢您的帮助。 数据集示例: ID登记日期结束日期住院日期 1 1/5/2004 1/6/2008 2/2/2006 2.等等 3. 4. id开始\u e结束\u e日期\u 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/2007Date 注册日期特定日期前后12个月,date,sas,subset,Date,Sas,Subset,我试图通过id查找在住院日期前12个月和住院日期后12个月连续注册的人员。每个成员将有一行。 这是在美国使用索赔数据库。感谢您的帮助。 数据集示例: ID登记日期结束日期住院日期 1 1/5/2004 1/6/2008 2/2/2006 2.等等 3. 4. id开始\u e结束\u e日期\u 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
3 6/4/2008 7/7/2012假设我最后的评论有答案,有很多方法可以做到这一点。一开始可能很难让外部连接、交叉连接等以易于理解的方式工作。使用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;
我从事索赔数据的工作,我想我理解你想问的问题。我建议在一张表中列出“精简”的登记范围,在另一张表中列出住院日期。然后您可以将它们合并在一起,只保留符合您标准的患者。以下代码将压缩注册范围(假设记录良好):
PROC SORT DATA=dset_in;按id enr_日期结束日期;跑
数据注册(KEEP=id注册\u开始注册\u停止);
设置dset_in;
格式化注册开始注册停止日期9。;
按id enr_日期结束日期;
保留注册\u开始注册\u停止;
如果是第一个,那么就做;
注册开始=注册日期;
注册\停止=结束\日期;
结束;
否则,如果enr_日期-注册站您只是查看以下信息:hosp日期-enr_日期>12个月和结束日期-hosp_日期>12个月?是的,但我希望连续注册而不中断服务。还有一些患者有多行。所以他们可以有不同的注册期。你需要更好地提问。如何不中断服务和多行发挥作用?如果您能显示完整的数据集和对问题的更好描述,请查看顶部的链接。一个患者可以有多个登记行,因为他们可能有2个月的覆盖率,然后是覆盖率差距。然后,他们可以开始另一个具有不同开始和结束日期的注册。我所说的不中断服务的意思是存在覆盖范围缺口。如果你看一下我发布的示例,那么只应该包括患者2。非常感谢您的帮助。请键入您的数据并将其包含在问题中,它为人们提供了一些可供使用的信息。此时要处理您的数据,我必须将其打印出来。您可以通过sql和日期使用自联接来生成解决方案。入学问题是一个常见的问题。在lexjansen.com或communities.sas.com上搜索许多类似的问题和答案。谢谢Dave和DCR。因为我正在处理索赔数据库,第二个答案最符合我的数据,它成功了!感激
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;
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;