Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 根据列中的其他值填写NA值_R_Time Series_Data.table_Missing Data - Fatal编程技术网

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

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:

我有一个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)
)与位置(
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用户提供大量信息!再次感谢。