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

phi*_*sch 7 r time-series missing-data data.table

我有一个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
Run Code Online (Sandbox Code Playgroud)

我需要一个操作,将其转换为:

    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
Run Code Online (Sandbox Code Playgroud)

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

akr*_*run 8

我们可以按'id'分组,并将行号(seq_len(.N))与which'x'中的position()区别开来,其中它是0(!x).我正在包装,as.numeric因为'x'列numeric在输入数据集中,但从差异来看,它被转换为'整数'.如果在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
Run Code Online (Sandbox Code Playgroud)

!x否则写得更清楚x==0.它返回一个逻辑向量TRUE/FALSE.如果有NA值,它将保持为NA.通过包装which,我们得到0价值的位置.在示例中,它是3针对每个'id'.