如何根据以前和未来的值填充缺失值或空值?

时间:2015-08-16 05:55:41

标签: r

假设我有以下数据集

ID A 
1  0
1  0
1  0
1  X
2  X
2  X
2  0
2  X
3  X
3  0
3  X
3  Y
4  X
4  X
4  0
4  Y

我想根据A的过去和未来值填充此数据集(变量A)。 例如,对于ID= 1,前三个值也将根据未来值变为X.对于ID=2,缺失值将变为X,因为过去和将来的值也是X.对于ID = 3,即使将来还存在另一个值Y,它也会变为X,但其相邻值为X,因此它将成为X.对于ID= 4,我们将仅基于过去的缺失值。

基本上,算法应首先查看过去的值;如果没有可用的过去值,那么它应该使用未来的值。

我知道根据平均值和中位数填充缺失值,但由于变量A不是数字,并且标准在每一步都在不断变化,我该如何解决这个问题呢?

1 个答案:

答案 0 :(得分:2)

我们可以使用na.locf中的zoo来填充之前值的缺失值。为此,我们将' 0'值为' NA'。使用data.table,我们可以转换' data.frame'到' data.table' (setDT(df1)),按ID' ID'分组在列中,我们使用na.locfna.rm=FALSE选项使用之前的非缺失值填充缺失值。然后,我们可以使用na.locf选项再次运行fromLast=TRUE,以便向后传输观察结果,并将剩余的NAs填入“A' A&#39}中。列。

library(zoo)
library(data.table)
is.na(df1$A) <- df1$A==0
setDT(df1)[,A := na.locf(na.locf(A, na.rm=FALSE), fromLast=TRUE) , by = ID]
df1
#    ID A
# 1:  1 X
# 2:  1 X
# 3:  1 X
# 4:  1 X
# 5:  2 X
# 6:  2 X
# 7:  2 X
# 8:  2 X
# 9:  3 X
#10:  3 X
#11:  3 X
#12:  3 Y
#13:  4 X
#14:  4 X
#15:  4 X
#16:  4 Y

数据

df1 <- structure(list(ID = c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L, 
3L, 3L, 4L, 4L, 4L, 4L), A = c("0", "0", "0", "X", "X", "X", 
"0", "X", "X", "0", "X", "Y", "X", "X", "0", "Y")), .Names = c("ID", 
"A"), class = "data.frame", row.names = c(NA, -16L))