Изменение значения NA при совпадении с определенной длиной - PullRequest
2 голосов
/ 14 февраля 2020

У меня есть данные такого типа:

daynight 
[1] NA NA NA NA  2  1 NA NA

Я хочу, чтобы R обнаружил, есть ли серия по крайней мере x NA, и заменил их другим значением. Например, если x = 3 и значение замены равно 3, я хочу, чтобы R дал мне в выводе:

daynight 
[1] 3 3 3 3 2 1 NA NA

У вас есть какие-нибудь идеи?

Ответы [ 2 ]

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

А вот еще одно решение с использованием пакета zoo

library(zoo)

replace_consecutive_NAs <- function(x, nrNAs = 3, replaceBy = nrNAs){
    x <- as.numeric(is.na(x))
    indexes <- (rollapply(x, 3, prod, fill = 0, align = "left") + 
                    rollapply(x, 3, prod, fill = 0, align = "right")) != 0
    x[indexes] <- replaceBy
    x
}

x <- c(NA, NA, NA, NA  ,2  ,1, NA, NA)

replace_consecutive_NAs(x, 3, 999)

[1] 999 999 999 999   2   1  NA  NA
2 голосов
/ 14 февраля 2020

Мы можем использовать rle

daynight <- c(NA, NA, NA, NA  ,2  ,1, NA, NA)
x <- 3
r <- 3
daynight[with(rle(is.na(daynight)), rep(lengths >= x & values, lengths))] <- r
daynight
#[1]  3  3  3  3  2  1 NA NA

Взяв другой пример:

daynight <- c(NA, NA, NA, 3,2,1, NA, NA, 1, NA, NA, NA, 1, NA, NA)
daynight[with(rle(is.na(daynight)), rep(lengths >= x & values, lengths))] <- r
#[1]  3  3  3  3  2  1 NA NA  1  3  3  3  1 NA NA
...