根据列中的其他值填充 NA 值

Filling in NA values based on other values in the column

我有一个 data.table 有大量缺失值。我想通过从 data.table 中的可用值中添加或减去值来填充这些值。特别是,请考虑以下数据:

> test = data.table(id=c("A","A","A","A","A","B","B","B","B","B"), x=c(NA,NA,0,NA,NA,NA,NA,0,NA,NA))
> test
    id  x
 1:  A NA
 2:  A NA
 3:  A  0
 4:  A NA
 5:  A NA
 6:  B NA
 7:  B NA
 8:  B  0
 9:  B NA
10:  B NA

我需要一个将这个转换成那个的操作:

    id  x
1:  A -2
2:  A -1
3:  A  0
4:  A  1
5:  A  2
6:  B -2
7:  B -1
8:  B  0
9:  B  1
10: B  2

基本上是 na.locf 的一个版本,它增加最后一个值而不是重复它。

我们可以按'id'分组,取行号(seq_len(.N))与'x'中的位置(which)的差值为0 (!x)。我用 as.numeric 换行,因为 'x' 列在输入数据集中是 numeric,但从差异来看,它被转换为 'integer'。如果在分配 (:=) 时 class 发生冲突,data.table 将显示错误,因为它需要匹配 class.

test[, x:= as.numeric(seq_len(.N)-which(!x)), id]
test
#    id  x
# 1:  A -2
# 2:  A -1
# 3:  A  0
# 4:  A  1
# 5:  A  2
# 6:  B -2
# 7:  B -1
# 8:  B  0
# 9:  B  1
#10:  B  2

!x另外写成x==0更清楚。它 returns 是 TRUE/FALSE 的逻辑向量。如果有 NA 个值,它将保持为 NA。通过用 which 换行,我们得到 0 值的位置。在示例中,每个 'id'.

3