我问了一个类似的问题How to calculate time duration for the continuous variables having same value in R并得到了很好的解决方案。但我错误地理解并描述了这个问题。实际上,正确的结果应该是计算当前颜色的持续时间,直到颜色变为另一个颜色,而不是从第一次到最后一次具有相同颜色的持续时间。
time sg. 0
1 2014-09-01 00:00:12.0 green
2 2014-09-01 00:00:13.5 green
3 2014-09-01 00:00:30.0 amber
4 2014-09-01 00:00:30.0 amber
5 2014-09-01 00:00:31.5 amber
6 2014-09-01 00:00:32.0 amber
7 2014-09-01 00:00:32.2 amber
8 2014-09-01 00:00:33.5 amber
9 2014-09-01 00:00:33.0 red
10 2014-09-01 00:00:35.0 red
11 2014-09-01 00:00:35.2 red
12 2014-09-01 00:00:37.0 red
13 2014-09-01 00:00:41.0 red
14 2014-09-01 00:00:42.0 red
15 2014-09-01 00:00:42.2 red
16 2014-09-01 00:00:43.0 red
17 2014-09-01 00:00:44.7 red
18 2014-09-01 00:00:44.2 red
19 2014-09-01 00:00:45.5 red
20 2014-09-01 00:00:47.0 red
21 2014-09-01 00:00:48.7 red
22 2014-09-01 00:00:49.7 red
23 2014-09-01 00:00:49.7 red
24 2014-09-01 00:00:49.9 red
25 2014-09-01 00:00:50.9 green
因此,对于这个数据片段,单独颜色(红色/绿色/琥珀色)的结果如下:
green 18.0
amber 3.0
red 17.9
...
我意识到处理这个问题我错了,但我不知道如何纠正。非常感谢您的帮助。
答案 0 :(得分:3)
这是使用data.table
包的可能方法。通常,我们将使用其shift
函数创建一个滞后变量,并使用其rleid
函数创建索引(因此green
不能组合在一起)。
library(data.table)
# If time is already of `POSIXct` class, you will not need to convert it again
setDT(df)[, `:=`(time = as.POSIXct(time),
ltime = shift(as.POSIXct(time), 1L, type = "lead"),
indx = rleid(sg.0))][, ltime[.N] - time[1], .(sg.0, indx)]
# sg.0 indx V1
# 1: green 1 18.0 secs
# 2: amber 2 3.0 secs
# 3: red 3 17.9 secs
# 4: green 4 NA secs
答案 1 :(得分:0)
为了扩展我的评论,这里有一些我从“时间”转换过来的虚假数据。格式。
xtime<-1:100 + runif(100)/5
xseq<-sample(c(4,5,6),20,rep=T)
# add a bit to get to 100 -- this depends on the seed you get for the random samples
xseq<-c(xseq,8)
xcol<-vector()
for ( j in xseq) {
xcol <- c(xcol,rep(sample(c('red','green','blue'),1),times=j))
}
tran <- rle(xcol)
transwitch <- c(1,cumsum(tran$lengths))
deltatime<-vector()
for (j in 1: length(transwitch)) deltatime[j] <- xtime[(transwitch[j+1])]-xtime[transwitch[j]]
# check part of the results...
deltatime[1:5]