一个可重复的小例子:
library(zoo)
set.seed(1)
m <- matrix(runif(16, 0, 100), nrow = 4)
missing_values <- sample(16, 7)
m[missing_values] <- NA
m
[,1] [,2] [,3] [,4]
[1,] 26.55087 20.16819 62.911404 68.70228
[2,] 37.21239 NA 6.178627 38.41037
[3,] NA NA NA NA
[4,] 90.82078 66.07978 NA NA
na.approx(m)
[,1] [,2] [,3] [,4]
[1,] 26.55087 20.16819 62.911404 68.70228
[2,] 37.21239 35.47206 6.178627 38.41037
[3,] 64.01658 50.77592 NA NA
[4,] 90.82078 66.07978 NA NA
m[4, 4] <- 50
na.approx(m)
[,1] [,2] [,3] [,4]
[1,] 26.55087 20.16819 62.911404 68.70228
[2,] 37.21239 35.47206 6.178627 38.41037
[3,] 64.01658 50.77592 NA 44.20519
[4,] 90.82078 66.07978 NA 50.00000
是的,看起来您确实需要知道列的开始/结束值,否则插值不起作用。你能猜出你的边界值吗?
另一个编辑:因此默认情况下,您需要知道列的开始值和结束值。然而有可能得到na.approx
总是通过传递来填补空白rule = 2
。请参阅菲利克斯的回答。您还可以使用na.fill
根据 Gabor 的评论,提供默认值。最后,您可以在两个方向上插值边界条件(见下文)或猜测边界条件。
编辑:进一步的想法。自从na.approx
仅在列中插值,并且您的数据是空间的,也许在行中插值也很有用。然后你就可以取平均值了。
na.approx
当整列都失败时NA
,所以我们创建一个更大的数据集。
set.seed(1)
m <- matrix(runif(64, 0, 100), nrow = 8)
missing_values <- sample(64, 15)
m[missing_values] <- NA
Run na.approx
双向。
by_col <- na.approx(m)
by_row <- t(na.approx(t(m)))
找出最好的猜测。
default <- 50
best_guess <- ifelse(is.na(by_row),
ifelse(
is.na(by_col),
default, #neither known
by_col #only by_col known
),
ifelse(
is.na(by_col),
by_row, #only by_row known
(by_row + by_col) / 2 #both known
)
)