如何计算使用R更改一列中的值之前的持续时间?

时间:2015-01-19 13:44:06

标签: r

我问了一个类似的问题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
...

我意识到处理这个问题我错了,但我不知道如何纠正。非常感谢您的帮助。

2 个答案:

答案 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]