Оцените, сколько последовательных истинных элементов содержится в векторе в R - PullRequest
2 голосов
/ 23 мая 2019

У меня действительно большой логический вектор (т. Е. 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

Ответы [ 2 ]

5 голосов
/ 23 мая 2019

Вы можете сделать:

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))
1 голос
/ 23 мая 2019

Другое решение с 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
...