Замена значений в списке на основе количества последовательных значений, часть которых они составляют - PullRequest
0 голосов
/ 23 октября 2018

У меня есть следующий список:

my_list <- list(c(1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1), c(0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0), c(0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1))
> my_list
[[1]]
 [1] 1 1 1 0 1 1 1 1 1 1 0 1 1

[[2]]
 [1] 0 0 0 0 1 1 0 1 1 1 1 1 0

[[3]]
 [1] 0 1 1 1 1 1 1 1 1 0 0 0 1

Везде, где имеется менее четырех последовательных 1 с, я хотел бы заменить эти 1 с 0 с.Результирующий список должен выглядеть следующим образом:

> my_new_list
[[1]]
 [1] 0 0 0 0 1 1 1 1 1 1 0 0 0

[[2]]
 [1] 0 0 0 0 0 0 0 1 1 1 1 1 0

[[3]]
 [1] 0 1 1 1 1 1 1 1 1 0 0 0 0

Я считаю, что должен использовать функции rle и inverse.rle, но я не могу понять, как это сделать.Спасибо за вашу помощь.

1 Ответ

0 голосов
/ 23 октября 2018

Для каждого компонента списка используйте rle и замените каждый элемент values на 0, если его lengths меньше или равно max_n, по умолчанию равно 3. Затем выполните обратное значение rle, чтобы получитьобратно полученный вектор.

replace_zeros <- function(x, max_n = 3) {
  r <- rle(x)
  r$values[r$lengths <= max_n] <- 0
  inverse.rle(r)
}
lapply(my_list, replace_zeros)

, дающий:

[[1]]
 [1] 0 0 0 0 1 1 1 1 1 1 0 0 0

[[2]]
 [1] 0 0 0 0 0 0 0 1 1 1 1 1 0

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