如何用相邻值替换数据框中的 NA(缺失值)
Posted
技术标签:
【中文标题】如何用相邻值替换数据框中的 NA(缺失值)【英文标题】:How to replace NA (missing values) in a data frame with neighbouring values 【发布时间】:2010-11-18 03:53:12 【问题描述】: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
我有一个像上面那样带有一些 NA 的数据框 x,我想使用相邻的非 NA 值来填充它,比如 2006-05-20 它将是 19&22 的平均值
问题是怎么回事?
【问题讨论】:
阿伦,请编辑问题并将数据缩进四个空格以使其正确显示。 【参考方案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 模型/卡尔曼平滑进行插补更先进。
还有更多可能的方法(请参阅paper,在这里深入挖掘以使用最适合您的问题的方法可能是有意义的。
【讨论】:
以上是关于如何用相邻值替换数据框中的 NA(缺失值)的主要内容,如果未能解决你的问题,请参考以下文章