使用data.table在每个组中向前滚动来填充缺失值

时间:2018-01-29 13:21:59

标签: r data.table missing-data

我的目标是通过向前滚动来按组填充缺失值。

虚拟数据

library(data.table)

DT <- structure(list(CLASS = c("A", "A", "A", "A", "A", "A", "B", "B","B"),
VAL = c(NA, 1, NA, NA, 2, NA, 50, NA, 100)),
.Names = c("CLASS", "VAL"),
row.names = c(NA, -9L), class = c("data.table", "data.frame"))

> DT
   CLASS VAL
1:     A  NA
2:     A   1
3:     A  NA
4:     A  NA
5:     A   2
6:     A  NA
7:     B  50
8:     B  NA
9:     B 100

期望的结果

   CLASS VAL
1:     A  NA
2:     A   1
3:     A   1
4:     A   1
5:     A   2
6:     A   2
7:     B  50
8:     B  50
9:     B 100

注意,here的结果不适用。

1)这为组中的每个观察指定了第一个非缺失值

#1
DT[, VAL:= VAL[!is.na(VAL)][1L] , by = CLASS]
> DT
   CLASS VAL
1:     A   1
2:     A   1
3:     A   1
4:     A   1
5:     A   1
6:     A   1
7:     B  50
8:     B  50
9:     B  50

2)如果要分配的行仅在i中过滤为缺失值,则在by分组时无法获取任何非NA值。所以结果没有任何改变。

> DT[is.na(VAL), VAL:= VAL[!is.na(VAL)][1L] , by = CLASS]
> DT
   CLASS VAL
1:     A  NA
2:     A   1
3:     A  NA
4:     A  NA
5:     A   2
6:     A  NA
7:     B  50
8:     B  NA
9:     B 100
9:     B  50

3)使用来自fill()的{​​{1}}的解决方案有效,但遗憾的是使用了包含350万行和200万个组的实际数据;运行时间约为6小时。所以我正在寻找一种更有效的tidyr解决方案。

data.table

1 个答案:

答案 0 :(得分:4)

您可以使用na.locf()包中的zoo功能:

DT[, VAL:=zoo::na.locf(VAL, na.rm = FALSE), "CLASS"]