计算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 的第一句话对于diflag 都是正确的;你应该避免在 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中连续访问之间的时间间隔的主要内容,如果未能解决你的问题,请参考以下文章

怎么用excel计算两个日期之间的间隔年限?

VB计算两个日期时间的间隔

db2 计算间隔天数

请问两个时间点之间的间隔怎么算?

计算分钟时间间隔之间的行数 - Python

SQL:计算两个时间间隔之间的工作时间