Небольшой воспроизводимый пример:
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
для предоставления значения по умолчанию, согласно комментарию Габора.Наконец, вы можете интерполировать граничные условия в двух направлениях (см. Ниже) или угадывать граничные условия.
РЕДАКТИРОВАТЬ: Дополнительная мысль.Поскольку 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
)
)