假设我有以下数据集
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不是数字,并且标准在每个步骤都在不断变化,我该如何解决这个问题?
我们可以使用na.locf
fromzoo
来用先前的值填充缺失的值。为此,我们将“ 0”值转换为“ NA”。使用data.table
,我们可以将'data.frame'转换为'data.table'(setDT(df1)
),并按'ID'列分组,我们使用na.locf
和na.rm=FALSE
选项使用先前的非缺失值填充缺失值。然后,我们可以再次运行na.locf
带有fromLast=TRUE
选项的选项,以使观察结果向后进行,并将其余部分填充到NAs
“ A”列中。
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))
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句