我有什么
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分组的新变量的最大值。但我无法找到办法做到这一点。也许它甚至不是最好的方法。
答案 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)
您可以使用tapply
和rle
:
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)]))