假设我有以下数据集
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不是数字,并且标准在每一步都在不断变化,我该如何解决这个问题呢?
答案 0 :(得分:2)
我们可以使用na.locf
中的zoo
来填充之前值的缺失值。为此,我们将' 0'值为' NA'。使用data.table
,我们可以转换' data.frame'到' data.table' (setDT(df1)
),按ID' ID'分组在列中,我们使用na.locf
和na.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))