问题描述
我的数据表如下所示:
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