NA, если значение заключено между NA - PullRequest
0 голосов
/ 04 февраля 2020

Я пытаюсь очистить свои данные. Давайте представим, что у нас есть вектор из 20 значений с несколькими NAs:

set.seed(1234)
x <- rnorm(20, mean = 10, sd = 5) %>% round
x[c(6, 8, 12, 16, 19)] <- NA

Так что это выглядит примерно так: > 4 11 15 -2 12 NA 7 NA 7 6 8 NA 6 10 15 NA 7 5 NA 22

Мне нужно заменить те значения, которые заключены в NA с NA). Например, 7 из моего вектора должно быть NA, потому что предыдущее и следующее значения NA. Я могу сделать это с помощью оператора ifelse и некоторых функций dplyr:

library(dplyr)

ifelse(is.na(lag(x))&is.na(lead(x)), NA, x)

> 4 11 15 -2 12 NA NA NA  7  6  8 NA  6 10 15 NA  7  5 NA NA

Вопрос в том, как заменить два значения, заключенные в NA. 7 и 5 например? Я пытался продублировать условие, т.е. сделать lag(lag(x)) и lead(lead(x)), но получаю беспорядок.

ifelse(is.na(lag(x))&is.na(lead(x)) | is.na(lead(lead(x)))&is.na(lag(lag(x))), NA, x)
 >  4 11 15 -2 12 NA NA NA  7 NA  8 NA  6 NA 15 NA  7  5 NA NA

1 Ответ

2 голосов
/ 04 февраля 2020

Мы можем сгруппировать по NA и посчитать длину каждой группы. Если он имеет длину 3, то это означает, что группа состоит из NA, value, value. Мы просто заменим эти значения на NA.

i1 <- cumsum(is.na(x))
x[ave(i1, i1, FUN = function(i)length(i)) == 3] <- NA
#[1]  4 11 15 -2 12 NA  7 NA  7  6  8 NA  6 10 15 NA NA NA NA 22
...