У меня действительно большой логический вектор (то есть T или F), и я хочу просто оценить, сколько «блоков» последовательных T есть в моем векторе, содержащем между элементы F.
Простой пример вектора с 3 из этих последовательных «блоков» из T элементов:
x <- c(T,T,T,T,F,F,F,F,T,T,T,T,F,T,T)
Выход:
1,1,1,1,0,0,0,0,2,2,2,2,0,3,3
Вы можете попробовать использовать кодирование длин серий; это сворачивает ваши прогоны TRUE/FALSE: stat.ethz.ch/R-manual/R-devel/library/base/html/rle.html





Ты можешь сделать:
rle <- rle(x)
rle$values <- with(rle, cumsum(values) * values)
inverse.rle(rle)
[1] 1 1 1 1 0 0 0 0 2 2 2 2 0 3 3
И упрощенная и более элегантная версия основной идеи (предложенная @Lyngbakr):
with(rle(x), rep(cumsum(values) * values, lengths))
Или даже with(rle, rep(cumsum(values) * values, lengths))
@Lyngbakr очень хорошая идея, я добавил ее в свой пост. Спасибо :)
Другое решение с rle/inverse.rle:
x <- c(T,T,T,T,F,F,F,F,T,T,T,T,F,T,T)
rle_x <- rle(x)
rle_x$values[rle_x$values] <- 1:length(which(rle_x$values))
inverse.rle(rle_x)
# [1] 1 1 1 1 0 0 0 0 2 2 2 2 0 3 3
(1) Вы имеете в виду, что окончательный вывод здесь должен быть просто 3? Или вы говорите, что вам нужен текущий подсчет, чтобы в любой момент вашей последовательности вы могли оценить, сколько
Tблоков произошло на данный момент? (2) Что представляет собой блок - более 1T? (3) Вы сказали, что хотите знать, сколько блоков являются элементами междуF, но вы включаете два блокаTна обоих концах последовательности, которые не находятся междуF. Что это?