我在这里跟随这个问题:efficiently locf by groups in a single R data.table
这对我的数据来说似乎很完美,因为我将数据分组为多列,我试图将最后一个观察结果向前推进。但是,我想限制它的前进距离。代码的相关部分是!is.na(x)
。让我们说我想将它限制为两个,然后给出序列TRUE TRUE FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE TRUE
,我希望将其作为TRUE TRUE FALSE FALSE TRUE TRUE TRUE TRUE FALSE FALSE TRUE
。
这本身讽刺真正向前的值达n次(非常类似于XTS),这似乎使得使用这种方法而不是xts.na.locf变得多余,但我希望有一个这样做的有效方法可以避免使用xts。谢谢你的帮助。
答案 0 :(得分:1)
一种可能性是通过将不需要的FALSE
重复转移到下一个TRUE
来修改向量的运行长度编码:
mx <- 2
v <- c(TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, TRUE)
r <- rle(v)
if(!r$values[length(r$values)]) {
r$values <- c(r$values,TRUE)
r$lengths <- c(r$lengths,0)
}
changes <- pmax(0,r$lengths-mx) * (r$values == FALSE)
r$lengths <- r$lengths - changes + c(0,head(changes,-1))
您显然必须测试这是否对您的用例更有效。
修改:输出符合预期:
> print(inverse.rle(r))
[1] TRUE TRUE FALSE FALSE TRUE TRUE TRUE TRUE FALSE FALSE TRUE
编辑2:简短说明:
pmax(0,r$lengths-mx)
是一个向量,其成分为零(如果长度最多为mx
)或长度与mx
之间的差异。由于只关注FALSE
的重复是相关的,因此需要乘以(r$values == FALSE)
,这会将对应于TRUE
的向量的任何条目都归零。if
已知r$values
的最后一个元素是TRUE
。因此,我们可以将不需要的FALSE
移动到以下TRUE
。这是通过首先从FALSE
的数量中减去然后加上TRUE
的数量来实现的。由于我们知道changes
的最后一个条目适用于TRUE
,c(0,head(changes,-1))
只需将所有更改(FALSE
)移至右侧(因此转移到TRUE
}})。