该rle
功能是您想要的:
set.seed(12345)
data = sample(c('A', 'C', 'G', 'T'), 100000, replace = TRUE, prob = rep(0.25, 4))
run_lengths = rle(data == 'A')
(result = max(run_lengths$lengths[run_lengths$values]))
# [1] 10
获得最长跑的位置有点困难。您可以使用which.max
它,但我们之前已经过滤掉了所有非A
结果。相反,我们也可以将所有非A
运行设置为0
——这样,它们仍然存在,但不会是最大值:
only_a = ifelse(run_lengths$values, run_lengths$lengths, 0)
longest_run_index = which.max(only_a)
现在我们需要计算从longest_run_index
到 里面的索引A
。我们通过将这个索引之前的所有运行的长度相加来做到这一点:
index = sum(run_lengths$lengths[seq_len(longest_run_index - 1)]) + 1
data[index : (index + result - 1)]
# [1] "A" "A" "A" "A" "A" "A" "A" "A" "A" "A"