限制逻辑中的谬数

时间:2017-02-08 22:46:30

标签: r

我在这里跟随这个问题: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。谢谢你的帮助。

1 个答案:

答案 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的最后一个条目适用于TRUEc(0,head(changes,-1))只需将所有更改(FALSE)移至右侧(因此转移到TRUE }})。