计算SAS中连续访问之间的时间间隔
Posted
技术标签:
【中文标题】计算SAS中连续访问之间的时间间隔【英文标题】:Calculate time interval between successive visits in SAS 【发布时间】:2014-09-21 23:56:22 【问题描述】:我有重复的长格式,例如
身份证访问日期
1 1 1990-12-16
1 2 1991-01-12
1 3 1991-09-01
2 1 2000-12-12
2 2 2001-11-30
我想计算连续访问之间的时间间隔(以周为单位)。对于每次访问,它将是访问日期 i 减去访问 i-1 的数据 [因此,访问间隔 =0,所有受试者 = 1]
我使用了延迟函数,但它所做的是时间与前一列(这是另一个日期)之间的差异。我怎样才能让它按列处理 id。
我使用了以下代码: 数据数据1;
set data;
by id;
if first.id then interval=0;
else interval=lag(date)/7; *divided by 7 as I wanted the interval to be in weeks;
run;
有什么帮助吗?如果是重复的帖子,请指导我。但是,我还没有发现任何类似的东西。谢谢。
PS:我不知道如何获取数据格式的数据。请帮助我不要标记它!!!
【问题讨论】:
【参考方案1】:您不能在条件代码中使用滞后日期,因此请将其从条件语句中删除。
假设日期是文本,您可以使用 input() 函数将其转换为 SAS 日期。
data data1;
set data;
by id;
date_sas=input(date, anydtdte.);
interval_lag=lag(date_sas)/7;
if first.id then interval=0;
else interval=interval_lag;
run;
【讨论】:
感谢@reese,但它仍然按行计算,而不是按我想要的按列计算。有什么进一步的帮助吗? 您需要发布一个更好的数据结构示例。很可能你会想要一个数组。 您想要dif
函数而不是lag
吗? Lag
返回上一个观察(行)的值,而dif
返回当前和之前观察之间的差异。 Reese 的第一句话对于dif
和lag
都是正确的;你应该避免在 if 语句中使用这些函数。
是的,dif 函数有效...非常感谢@ArchStanton【参考方案2】:
我不知道你是否还在寻找这个问题的答案,但这应该可以解决问题:
我是这样读入数据的:
data test;
input id visit date :yymmdd.; *this is how you tell SAS to read the date as a date;
format date yymmdd10.;
datalines;
1 1 1990-12-16
1 2 1991-01-12
1 3 1991-09-01
2 1 2000-12-12
2 2 2001-11-30
;
run;
然后计算你想要的:
data data1;
set test;
by id;
retain date_n;
if first.id then do;
interval = 0;
date_n = date;
end;
else do;
interval = (date - date_n)/7;
date_n = date;
end;
run;
希望这会有所帮助!
【讨论】:
以上是关于计算SAS中连续访问之间的时间间隔的主要内容,如果未能解决你的问题,请参考以下文章