2017-02-08 24 views
0

我这个问题在这里沿着如下: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

一种可能性是由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$valuesTRUE。因此我们可以将移至不需要的FALSE s至以下TRUE。这是通过首先从FALSE秒的数中减去,然后加上TRUE秒的数来实现的。由于我们知道changes的最后一个条目是TRUE,因此只需将c(0,head(changes,-1))的所有更改(对于FALSE)右移(并因此移至TRUE)。
+0

完美的是,你甚至可以处理它优雅地以FALSE结尾的情况。我想知道如果为了我自己的理解,你可以解释代码的最后两行(更改和修改r长度)?我试图用if语句来处理case,但是这样更干净更快。谢谢! – Almacomet

+0

好的 - 看我的编辑 –