Подсчитать значения одного и того же вида подряд и пропустить прерывания - PullRequest
1 голос
/ 14 марта 2019

Моя проблема в том, что я хочу посчитать длину похожих значений в моем векторе, например:

v <- c(1,1,1,1,2,1,1,3,3,3,1,1,2,2,2)

Но дополнительно я хочу опустить все прерывания с длиной 1. Как я могу добиться, чтобы мой результат здесь был:

1,1,1,1,1,1,1,3,3,3,1,1,2,2,2

Обратите внимание, что одиночные "два" теперь должны превращаться в "один" и с

v_new <- c(1,1,1,1,1,1,1,3,3,3,1,1,2,2,2)

rle(v_new)
lengths: int [1:4] 7 3 2 3 
values : num [1:4] 1 3 1 2

Спасибо, Mike

Ответы [ 2 ]

1 голос
/ 14 марта 2019

Ниже приведена небольшая функция, которая заменяет значения, которые встречаются не более одного раза подряд, значением слева или справа от него.

Ваш ввод

v <- c(1,1,1,1,2,1,1,3,3,3,1,1,2,2,2)
fun(v)
# [1] 1 1 1 1 1 1 1 3 3 3 1 1 2 2 2

Модифицированный ввод

v <- c(1,1,1,1,2,4,4,3,3,3,1,1,2,2,2)
#                ^ ^

Использование

fun(v, align = "right")
# [1] 1 1 1 1 4 4 4 3 3 3 1 1 2 2 2

По умолчанию выровнено по левому краю

fun(v)
# [1] 1 1 1 1 1 4 4 3 3 3 1 1 2 2 2

функция

fun <- function(x, align = c("left", "right")) {
      align <- match.arg(align)
      rle_x <- rle(x)
      rle_x$values <- with(rle_x, replace(values, lengths == 1, NA))
      switch(align,
             left = approx(inverse.rle(rle_x), xout = seq_along(x), method = "constant", f = 0)$y,
             right = approx(inverse.rle(rle_x), xout = seq_along(x), method = "constant", f = 1)$y)
    }
1 голос
/ 14 марта 2019
> v <- c(1,1,1,1,2,1,1,3,3,3,1,1,2,2,2)
> 
> local.peak <- which(diff(sign(diff(v)))==-2) + 1
> 
> v[which(diff(sign(diff(v)))==-2) + 1] <- v[local.peak - 1]
> v
 [1] 1 1 1 1 1 1 1 3 3 3 1 1 2 2 2

Функция локального пика взята из Поиск локальных максимумов и минимумов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...