Ответ 1
Небольшой, воспроизводимый пример:
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
Yup, похоже, вам нужны начальные/конечные значения столбцов, которые будут известны, или интерполяция не работает. Можете ли вы угадывать значения для своих границ?
ДРУГОЙ РЕДАКТИРОВАНИЕ: Таким образом, по умолчанию вам нужно знать начальные и конечные значения столбцов. Однако можно получить na.approx
, чтобы всегда заполнять пробелы, передавая rule = 2
. См. Ответ Феликса. Вы также можете использовать na.fill
для предоставления значения по умолчанию, как в комментарии Gabor. Наконец, вы можете интерполировать граничные условия в двух направлениях (см. Ниже) или угадать граничные условия.
EDIT: Еще одна мысль. Поскольку 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
Запустите 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
)
)