Интерполировать значения NA в одной переменной, используя линейный интерполант - PullRequest
1 голос
/ 12 октября 2019

Попытка интерполировать значения NA в кадре данных и попытка использовать zoo::na.approx, но это просто возвращает одинаково расположенные значения.

Чтобы продемонстрировать, учитывая кадр данных:

library(dplyr)
library(zoo) 
df <- data.frame(
      a = c(1,5 ,6 , 10),
      b = c(100, NA, NA, 1000)
)

Попробовал это:

df %>% 
  mutate(b = zoo::na.approx(b, rule = 2))

Вместо этого хотел получить это:

desired_df <- data.frame(
  a = c(1, 5 ,6 , 10),
  b = c(100, 500, 600, 1000)
)

Isесть легкодоступная функция для этого, или она должна быть написана с использованием формулы линейной интерполяции:

enter image description here

Ответы [ 3 ]

1 голос
/ 12 октября 2019

На самом деле, он доступен в zoo:

desired_df <- as.zoo(df, order.by = df$a) %>% 
  na.approx()

Как видите, вам нужно было преобразовать ваш фрейм данных в zoo класс.

1 голос
/ 12 октября 2019
lin_interp <- function(known, unknown) {
  # unknown object
  i1 <- !is.na(unknown)

  approx(x = known[i1], 
         y = unknown[i1], 
         xout = known)$y
}

для повышения читабельности кода

Вывод по желанию:

df %>% 
  mutate(b = lin_interp(a, b))
0 голосов
/ 12 октября 2019

Причина, по которой код na.approx не работает, заключается в том, что он отправляет методы путем проверки класса. Если мы проверим

library(zoo)
methods('na.approx')
#[1] na.approx.default na.approx.ts*     na.approx.zoo*    na.approx.zooreg*

Метод na.approx.default применяется к данным ОП, поскольку он не является zoo объектом. Поведение этих методов отличается, если мы проверяем исходный код

na.approx.default

и для * функций

getAnywhere('na.approx.zoo')

Так что, как упоминалось в другом ответе, если мы преобразуем в соответствующийкласс, сгенерированный вывод также будет отличаться, потому что отправленный метод основан на class

...