Получить индекс элемента в нефильтрованном векторе - PullRequest
0 голосов
/ 16 января 2019

У меня есть объект rle из вектора, и я хотел бы получить сумму длин (со значениями == TRUE & values ​​== FALSE) до и после максимальной длины (со значениями == TRUE)

Что я могу сделать:

se <- c(3,1,2,3,1,2,3,4,5,6,5,8,9,9,9,5,4,3,4,5,4,3,2)
obj <- rle(se > 4)

obj

Run Length Encoding
  lengths: int [1:5] 8 8 3 1 3
  values : logi [1:5] FALSE TRUE FALSE TRUE FALSE

#Getting the maximum with values == True
with(obj, max(lengths[values]))

8

Однако теперь я не уверен, что делать дальше. Если я попытаюсь найти максимум 8 с помощью match (), я сначала найду элемент со значениями == FALSE, и я не могу полагать, что другой длины нет = 8 со значениями == ЛОЖЬ справа от максимума, который я пытаюсь найти.

Для показанного примера ожидаемый результат будет:

Sum1 = 8 
Sum2 = 7

Большое спасибо за вашу помощь, yasel

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Другой возможный подход:

with(obj, {
    i <- which(values & lengths==max(lengths))
    c(sum(lengths[seq_len(i-1)]), sum(lengths[-seq_len(i)]))
    })

выход:

[1] 8 7
0 голосов
/ 16 января 2019

Вот идея, которая использует rleid из data.table для создания TRUE/FALSE групп, т.е.

i1 <- setNames(se > 4, data.table::rleid(se > 4))
i2 <- names(which.max(tapply(names(i1)[i1], names(i1)[i1], length)))
sum1 <- length(i1[names(i1) < i2])
sum2 <- length(i1[names(i1) > i2])
sum1
#[1] 8
sum2
#[1] 7

Вы также можете сделать это функцией,

f1 <- function(x, size) {
    i1 <- setNames(x > size, data.table::rleid(se > size))
    i2 <- names(which.max(tapply(names(i1)[i1], names(i1)[i1], length)))
    return(c(length(i1[names(i1) < i2]), length(i1[names(i1) > i2])))
}

f1(se, 4)
#[1] 8 7
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...