Подтвердить что ты не робот

Как заменить NA (отсутствующие значения) в кадре данных с соседними значениями

862 2006-05-19 6.241603 5.774208     
863 2006-05-20 NA       NA      
864 2006-05-21 NA       NA      
865 2006-05-22 6.383929 5.906426      
866 2006-05-23 6.782068 6.268758      
867 2006-05-24 6.534616 6.013767      
868 2006-05-25 6.370312 5.856366      
869 2006-05-26 6.225175 5.781617      
870 2006-05-27 NA       NA     

У меня есть фрейм данных x, как указано выше, с некоторым NA, который я хочу заполнить, используя соседние значения, отличные от NA, например, в течение 2006-05-20, это будет 19 и 22

Как это вопрос?

4b9b3361

Ответ 1

Правильно отформатированные данные выглядят следующим образом:

862 2006-05-19 6.241603 5.774208 
863 2006-05-20 NA       NA 
864 2006-05-21 NA       NA 
865 2006-05-22 6.383929 5.906426 
866 2006-05-23 6.782068 6.268758 
867 2006-05-24 6.534616 6.013767 
868 2006-05-25 6.370312 5.856366 
869 2006-05-26 6.225175 5.781617 
870 2006-05-27 NA       NA

и имеет характер временного ряда. Поэтому я бы загрузил объект класса zoo (из zoo), поскольку это позволяет вам выбирать ряд стратегий - см. ниже. Какой из них вы выбираете, зависит от характера ваших данных и приложений. В общем случае поле "вычисление отсутствующих данных" называется вменением данных и существует довольно большая литература.

R> x <- zoo(X[,3:4], order.by=as.Date(X[,2]))
R> x
               x     y
2006-05-19 6.242 5.774
2006-05-20    NA    NA
2006-05-21    NA    NA
2006-05-22 6.384 5.906
2006-05-23 6.782 6.269
2006-05-24 6.535 6.014
2006-05-25 6.370 5.856
2006-05-26 6.225 5.782
2006-05-27    NA    NA
R> na.locf(x)  # last observation carried forward
               x     y
2006-05-19 6.242 5.774
2006-05-20 6.242 5.774
2006-05-21 6.242 5.774
2006-05-22 6.384 5.906
2006-05-23 6.782 6.269
2006-05-24 6.535 6.014
2006-05-25 6.370 5.856
2006-05-26 6.225 5.782
2006-05-27 6.225 5.782
R> na.approx(x)  # approximation based on before/after values
               x     y
2006-05-19 6.242 5.774
2006-05-20 6.289 5.818
2006-05-21 6.336 5.862
2006-05-22 6.384 5.906
2006-05-23 6.782 6.269
2006-05-24 6.535 6.014
2006-05-25 6.370 5.856
2006-05-26 6.225 5.782
R> na.spline(x)   # spline fit ...
               x     y
2006-05-19 6.242 5.774
2006-05-20 5.585 5.159
2006-05-21 5.797 5.358
2006-05-22 6.384 5.906
2006-05-23 6.782 6.269
2006-05-24 6.535 6.014
2006-05-25 6.370 5.856
2006-05-26 6.225 5.782
2006-05-27 5.973 5.716
R> 

Ответ 2

В зависимости от данных tidyr::fill() может быть вариант:

library(tidyverse)

df %>% fill(x)                    # single column x
df %>% fill(x, y)                 # multiple columns, x and y
df %>% fill(x, .direction = 'up') # filling from the bottom up rather than top down

Ответ 3

Похоже, это временные ряды, поэтому методы замены значений (вменения) во временных рядах, вероятно, имеют здесь смысл.

Эти методы ищут корреляции одной переменной во времени и соответственно оценивают эти недостающие данные.

Например. пакет imputeTS может быть вариантом здесь. Есть несколько вариантов:

library("imputeTS")
na_interpolation(data)

Для использования линейной интерполяции для замены отсутствующих значений.

library("imputeTS")
na_ma(data)

Для использования скользящего среднего для замены отсутствующих значений.

library("imputeTS")
na_kalman(data)

Немного более продвинутое использование моделей ARIMA/сглаживания Калмана для вменения.

Существуют и другие возможные методы (см. эту статью, возможно, здесь есть смысл покопаться немного глубже, чтобы использовать наиболее подходящий для вашей задачи).