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



有多种方法可以填充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

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

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+估算TS估算除最后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(状态空间模型上的卡尔曼滤波)或插补TS包提供的其他插补函数(有关函数列表,请参阅插补TS文档中的

最新更新