我正在搜索一个方法(没有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等组合,但找不到合适的方法来执行此操作。
答案 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