在R中搜索连续TRUE的最大长度和ID

时间:2013-10-28 09:41:56

标签: r boolean

我正在搜索一个方法(没有for循环)来查找数组和数组中最大连续TRUE的长度。例如

foo <- as.numeric(runif(100) > 0.5)

给你100个洗牌0和1.现在我正在搜索最长的连续行1和此数组中的相应ID。例如

foo2 <- c(0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1)

应该导致

max.dur = 8
max.ids = c(6, 13)

我尝试使用table,cumsum等组合,但找不到合适的方法来执行此操作。

2 个答案:

答案 0 :(得分:2)

这是一种方法:

foo2 <- c(0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1)

tmp <- rle(foo2) # calculates the lengths of runs of equal values
idx <- which.max(replace(tmp$length, !tmp$values, -1)) 
    # index of maximum number of consecutive 1s

max.dur <- tmp$lengths[idx]
# [1] 8
max.ids <- c(0, cumsum(tmp$lengths))[c(idx, idx + 1)] + c(1, 0)
# [1]  6 13

答案 1 :(得分:1)

您可以使用rle

foo <- c(0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1)
XX <- rle(foo)
max.dur <- max(XX$lengths)
max.dur
## [1] 8

max.ids <- cumsum(XX$lengths)[XX$lengths == max.dur] - c(max.dur - 1, 0)
max.ids
## [1]  6 13