[英]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.