如何用相邻的值替换数据框中的NA(缺失值)

18
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的平均值。

如何做到这一点?


Arun,请编辑问题并将数据缩进四个空格,以便正确显示。 - Dan Goldstein
3个回答

35

正确格式化数据应该长成这样

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> 

1
这似乎是时间序列,因此在此处使用时间序列缺失值替换(插补)方法可能是有意义的。
这些方法寻找时间中一个变量的相关性,并相应地估计这些缺失的数据。
例如,imputeTS包可能是一个选项。有多个选择:
library("imputeTS")
na_interpolation(data)

使用线性插值来替换缺失值。

library("imputeTS")
na_ma(data)

使用移动平均值来替换缺失值。
library("imputeTS")
na_kalman(data)

使用ARIMA模型/卡尔曼平滑进行插补需要更高级的技能。

还有更多可能的方法(请参见论文),在这里深入挖掘以使用最适合您问题的方法可能是有意义的。


0

根据数据,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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接