Comment remplacer NA (valeurs manquantes) dans une trame de données avec des valeurs voisines
-
12-09-2019 - |
Question
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
J'ai une trame de données x comme ci-dessus avec un certain NA, que je veux remplir en utilisant des valeurs non-NA voisins comme pour 2006-05-20 il sera moyenne de 19 et 22
Comment faire est la question?
La solution
correctement formaté vos données ressemble à ceci
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
et est de nature séries chronologiques. Donc je charger un objet de zoo
de classe (de la Zoo package) comme qui vous permet de choisir un certain nombre de stratégies - voir ci-dessous. Lequel vous choisissez dépend de la nature de vos données et applications. En général, le champ de « données manquantes sur chiffrage » est appelé imputation de données
et il y a une assez grande littérature.
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>
Autres conseils
En fonction du tidyr::fill()
de données peut être une option:
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