0

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

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 和 which 的组合,但找不到合适的方法来做到这一点。

4

2 回答 2

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
于 2013-10-28T09:53:41.717 回答
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
于 2013-10-28T09:55:48.107 回答