查找多行中一集的最长连续持续时间

时间:2014-04-14 19:01:00

标签: r

我有什么

ID | t | event
A | 1 | 0
A | 2 | 1
A | 3 | 1
A | 4 | 0
A | 5 | 1
A | 6 | 1
A | 7 | 1
A | 8 | 1
A | 9 | 0
B | 1 | 1
B | 2 | 1
B | 3 | 1
B | 4 | 0
B | 5 | 1
B | 6 | 0
B | 7 | 1
B | 8 | 1
B | 9 | 0

我想要什么

ID | maximum duration of event
A | 4
B | 3

A是4,因为最长的事件持续时间是从t5到t8。 B是3,因为最长的事件持续时间是从t1到t3。

我在考虑在新变量中对连续事件进行编号,在有新ID时重新开始,然后选择按ID分组的新变量的最大值。但我无法找到办法做到这一点。也许它甚至不是最好的方法。

2 个答案:

答案 0 :(得分:3)

Ananda的答案更快更容易阅读:

library(data.table)

setDT(mydf) # convert to data.table in place

mydf[, max(rle(event)$lengths), by = ID]
#   ID V1
#1: A   4
#2: B   3

答案 1 :(得分:2)

您可以使用tapplyrle

tapply(mydf$event, mydf$ID, rle)
# $`A `
# Run Length Encoding
#   lengths: int [1:5] 1 2 1 4 1
#   values : int [1:5] 0 1 0 1 0
#
# $`B `
# Run Length Encoding
#   lengths: int [1:6] 3 1 1 1 2 1
#   values : int [1:6] 1 0 1 0 1 0

lapply(tapply(mydf$event, mydf$ID, rle), function(x) max(x$lengths))
# $`A `
# [1] 4
# 
# $`B `
# [1] 3

如果您只想考虑1的运行,请按如下所示进行修改:

lapply(tapply(mydf$event, mydf$ID, rle), 
       function(x) max(x$lengths[as.logical(x$values)]))