繁体   English   中英

R 用最后一个值填充 NA 最多 n 次

[英]R Fill NA with last value for a max of n times

有多种方法可以填充 R 中的缺失值。但是,我找不到只填充最后 n 个 NA 的解决方案。

可用选项:

na_vector <- c(1, NA, NA, NA, 2, 3, NA, NA)

library(zoo)

na.locf(na_vector)
# Outputs: [1] 1 1 1 1 2 3 3 3

na.locf0(na_vector, maxgap = 2)
# Outputs: [1] 1 NA NA NA  2  3  3  3

我希望它如何:

na_vector <- c(1, NA, NA, NA, 2, 3, NA, NA)

fill_na <- function(vector, n){
   ...
}

fill_na(na_vector, n = 1)
# Outputs: [1] 1 1 NA NA  2  3  3  NA

fill_na(na_vector, n = 2)
# Outputs: [1] 1 1 1 NA  2  3  3  3

这是使用dplyr和递归获取这些输出的选项:

na_vector <- c(1, NA, NA, NA, 2, 3, NA, NA)

fill_na <- function(vector, n){
  if (n == 0) {
    vector
  } else {
    fill_na(
      vector = dplyr::coalesce(vector, dplyr::lag(vector)),
      n = n - 1
    )
  }
}

fill_na(na_vector, n = 1)
# [1]  1  1 NA NA  2  3  3 NA

fill_na(na_vector, n = 2)
# [1]  1  1  1 NA  2  3  3  3

在每次连续运行的 NA 中对 NA 进行编号,给出a ,然后仅填写数字小于或等于n的那些。 这仅在内部使用向量运算,不使用迭代或递归。

library(collapse)
library(zoo)

fill_na <- function(x, n) {
  a <- ave(x, groupid(is.na(x)), FUN = seq_along)
  ifelse(a <= n, na.locf0(x), x)
}

fill_na(na_vector, 1)
## [1]  1  1 NA NA  2  3  3 NA
fill_na(na_vector, 2)
## [1]  1  1  1 NA  2  3  3  3

这是一个基于基础 R + imputeTS 估算除最后 n 个 NA 之外的所有内容的解决方案。

library(imputeTS)
na_vector <- c(1, NA, NA, NA, 2, 3, NA, NA)

# The function that allows imputing everything except the last n NAs
fill_except_last_n_na <- function(x, n) {
  index <- which(rev(cumsum(rev(as.numeric(is.na(x))))) == n+1)
  x[1:tail(index,1)] <- na_locf(x[1:tail(index,1)])
  return(x)
}

# Call the new function
fill_except_last_n_na(na_vector,2)

## Result
[1]  1  1  1  1  2  3 NA NA

当您想使用不同于上次观察结果的其他插补选项时,您只需将na_locf替换为na_ma (移动平均值)、 na_interpolation (插值)、 na_kalman (状态空间模型上的 Kalman Smooting)或imputeTS包提供的其他插补函数(另请参阅imputeTS 文档中的函数列表。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM