R 如果匹配定义的长度,则更改NA值

R 如果匹配定义的长度,则更改NA值,r,vector,pattern-matching,na,R,Vector,Pattern Matching,Na,我有这样的数据: daynight [1] NA NA NA NA 2 1 NA NA 我希望R检测是否存在一系列至少xNA的值,并用另一个值替换这些值。 例如,如果x=3,替换值为3,我希望R在输出中给出: daynight [1] 3 3 3 3 2 1 NA NA 你有什么想法吗?我们可以使用rle daynight <- c(NA, NA, NA, NA ,2 ,1, NA, NA) x <- 3 r <- 3 daynight[with(rle(is.

我有这样的数据:

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

你有什么想法吗?

我们可以使用
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下面是另一个使用
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
图书馆(动物园)
替换\u连续\u NAs
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