使用data.table shift而不是fill = NA填充来回收矢量值

时间:2018-11-12 02:20:57

标签: r data.table

我想使用shift中的data.table函数来引导/滞后一个新列,但是我想从添加到data.table的滞后向量中回收值。 。据我所知fill must be a vector of length 1,因此滞后的值必须填充一个恒定值(即这里的NA)。

请参阅下面的MWE。

dt1是按原样使用data.table函数的结果shift。新的b列的值为NA,其中应为4、5和6。

dt2是所需的数据表结果。如果我的想法是正确的,则输出需要R回收规则,但在向量应开始的位置指定了超前/滞后值。

我本可以添加一个新向量(请参见x_to_avoid,请参见下文),但是我希望避免进行更多的手动工作。

谢谢

library(data.table)
library(magrittr)

# vector to lead/lag when updating datatable
x = c(1:6)

# leaves NA where 4, 5, 6 "should" have gone for my purposes
dt1 <- data.table(a = c(1:10)) %>% 
  .[, b := shift(x,
                 n = 3L,
                 fill = NA,
                 type = c("lag"))]
dt1

# desired output
dt2 <- dt1[, .(a)] %>% 
  .[, b := c(4,5,6,1,2,3,4,5,6,1)]

# could use another vector, but my actual use is more complicated and I prefer to avoid this (if possible)
x_to_avoid = c(4,5,6,1:6,1)

1 个答案:

答案 0 :(得分:0)

我认为binhf::shift可以胜任。首先,您需要使用rep.len加长向量,然后可以使用binhf::shift对其进行循环。不过我对性能一无所知。