Zoo 包具有函数 na.approx (或 na.spline),它可以用 approx 或 spline 替换数据中的 NA。
一个潜在的争论是maxgap哪一个给出了最大的需要填补的空白。这工作得很好,除了如果 NA 位于向量的开头,该函数会更改向量的长度。
例如:
require(zoo)
x <- 1:20 + rnorm(20)
x1 <- x
x1[5] <- x1[6] <- NaN
length(na.approx(x1, maxgap = 1)) == length(x) # TRUE
x2 <- x
x2[1] <- x2[2] <- NaN
length(na.approx(x2, maxgap = 1)) == length(x) # FALSE
Run Code Online (Sandbox Code Playgroud)
当将此函数与数据框一起使用时,这是有问题的。例如:
require(dplyr)
df1 <- tibble(A = 1:20, B = x1)
df1 %>%
mutate(B_fill = na.approx(B, maxgap = 1))
df2 <- tibble(A = 1:20, B = x2)
df2 %>%
mutate(B_fill = na.approx(B, maxgap = 1))
# Error: Column `B_fill` must be length 20 (the number of rows) or one, not 18
Run Code Online (Sandbox Code Playgroud)
当我问这个问题时,我找到了答案,只需改变na.rm论点即可。
df2 %>%
mutate(B_fill = na.approx(B, maxgap = 1, na.rm = FALSE))
Run Code Online (Sandbox Code Playgroud)