2015-11-03 42 views
1

我需要基于按时间顺序排列的对象(此处为日期)创建一个值序列(在下面的数据框中命名为“seq”)。要建立一个新的序列,两个日期之间的时间间隔需要严格大于1小时。基于按时间顺序排列的对象创建值序列

下面是一个例子

ID date     seq 
A  2010-04-14 02:00:12 1 
A  2010-04-14 02:00:12 1 
A  2010-04-14 03:00:10 1 
A  2010-04-14 03:00:10 1 
A  2010-04-14 04:00:15 1 
A  2010-04-14 04:00:15 1 
A  2010-04-14 08:00:10 2 
A  2010-04-14 08:00:10 2 
B  2010-04-14 03:00:18 3 
B  2010-04-14 03:00:18 3 
B  2010-04-14 04:00:10 3 
B  2010-04-14 04:00:10 3 
B  2010-04-14 10:00:14 4 
B  2010-04-14 10:00:14 4 
B  2010-04-14 11:00:10 4 
B  2010-04-14 11:00:10 4 

数据

tab <- data.frame(ID= rep(c("A","B"), each=8), date= as.POSIXct(c('2010-04-14 02:00:12','2010-04-14 02:00:12','2010-04-14 03:00:10', '2010-04-14 03:00:10','2010-04-14 04:00:15','2010-04-14 04:00:15','2010-04-14 08:00:10','2010-04-14 08:00:10','2010-04-14 03:00:18','2010-04-14 03:00:18','2010-04-14 04:00:10','2010-04-14 04:00:10','2010-04-14 10:00:14','2010-04-14 10:00:14','2010-04-14 11:00:10','2010-04-14 11:00:10'), format='%Y-%m-%d %H:%M:%S')) 
+0

像'1L + cumsum(DIFF(标签$日期)> 60 * 60)' – Frank

回答

1

所需输出似乎不正确,因为有一个“2010-04-14 03: 00:10“和”2010-04-14 04:00:15“,但是你的序列不会增加。从你的例子中也不清楚当ID变化时序列是否应该增加。

假设seq“2010-04-14三点00分10秒”和“2010-04-14 4点○○分15秒”,并在ID值应该不会影响seq之间应该增加,这里有一个解决方案:

tab$seq <- c(0, cumsum(abs(diff(tab$date)) > 3600)) + 1 
+0

非常感谢约书亚。我得到了这个错误信息:$ < - 。data.frame中的错误(* tmp *,“seq”,value = c(1,1,1,2,2,3,: 替换有15行,数据有16' – Pierre

+0

@Pierre:固定。 –

1

这行代码应该服务宗旨:

tab$seq <- floor(as.numeric(tab$date-min(tab$date))/3600)