R 根据列中的其他值填写NA值
我有一个data.table,其中有大量缺少的值。我想通过从data.table中的可用值中添加或减去值来填充这些值。特别是,考虑这些数据:R 根据列中的其他值填写NA值,r,time-series,data.table,missing-data,R,Time Series,Data.table,Missing Data,我有一个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:
> 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)
)与位置(which
)在“x”中的差值,其中它是0(!x
)。我用as.numeric
换行,因为输入数据集中的“x”列是numeric
,但根据差异,它被转换为“integer”。如果分配(:=
)时类中发生冲突,data.table将显示错误,因为它需要匹配类
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
。它返回一个逻辑向量TRUE/FALSE
。如果存在NA
值,它将保持为NA
。通过使用which
,我们得到0
值的位置。在本例中,每个“id”都是3
。就像一个符咒!非常感谢,我一直在尝试locf和cumsum的各种组合。@phildeutsch感谢您的反馈。很高兴知道它能工作。@akrun我想知道为什么哪个(!x)
返回3?@jazzurro早些时候我写了哪个(x==0)
<代码>!x
基本上是将值转换为TRUE,将对应的x值0转换为FALSE,将所有其他值转换为FALSE,而NA保持为TRUENA@akrun您总是为SO用户提供大量信息!再次感谢。