比较行并用数据表中的先前值填充空白

问题描述

我的数据表如下所示:

library(data.table)
data <- data.table(time = c(seq(0,14)),anom = c(0,1,0),gier = c(0,4,9,7,2,3,0))

现在,我想用anom列中的空白填充零(零),以便结果看起来像这样:

res <- data.table(time = c(seq(0,0))

此外,还有一个问题是我想灵活地调整间隙大小,以便选择间隙可以有多大。必须有一种简单的方法,仅对实数值(也许用行的前一个值而不是一个或零填充),并且不仅要对像函数fill或{{ 1}}。

解决方法

使用maxgap参数选择最大间隙尺寸的示例

library(zoo)
na.fill(
  na.locf(
    replace(data$anom,data$anom==0,NA),na.rm=F,maxgap=2
  ),0
)

 [1] 0 0 0 1 1 1 1 1 1 1 1 1 0 0 0
,

这是使用滚动连接的另一种选择:

maxgap <- 1L
data[,c("rn","lu") := .(.I,anom)]
data[anom==0L,lu := fcoalesce(
    data[anom!=0L][.SD,on=.(rn=rn),roll=maxgap,rollends=c(FALSE,FALSE),x.anom],anom)
]

输出:

    time anom gier rn lu
 1:    0    0    0  1  0
 2:    1    0    0  2  0
 3:    2    0    0  3  0
 4:    3    1    4  4  1
 5:    4    1    9  5  1
 6:    5    1    7  6  1
 7:    6    0    2  7  1
 8:    7    0    0  8  0
 9:    8    1    3  9  1
10:    9    0    1 10  1
11:   10    1    4 11  1
12:   11    1    2 12  1
13:   12    0    0 13  0
14:   13    0    0 14  0
15:   14    0    0 15  0