感谢您首先在dt1.9.6中实现了shift。
当我有许多不同的组时,
这里有一个详细的脚本:https://github.com/nachti/datatable_test/blob/master/leadtest.R 我是否误用了
编辑:避免使用
除此之外,使用
shift()
比我的旧代码慢得出乎意料。library(data.table)
library(microbenchmark)
set.seed(1)
mg <- data.table(expand.grid(year = 2012:2016, id = 1:1000),
value = rnorm(5000))
microbenchmark(dt194 = mg[, l1 := c(value[-1], NA), by = .(id)],
dt196 = mg[, l2 := shift(value, n = 1,
type = "lead"), by = .(id)])
## Unit: milliseconds
## expr min lq mean median uq max eval
## dt194 4.93735 5.236034 5.718654 5.623736 5.74395 9.555922 100
## dt196 83.92612 87.530404 91.700317 90.953947 91.43783 257.473242 100
这里有一个详细的脚本:https://github.com/nachti/datatable_test/blob/master/leadtest.R 我是否误用了
shift()
?编辑:避免使用
:=
也没有帮助 (@MichaelChirico):microbenchmark(dt194 = mg[, c(value[-1], NA), by = id],
dt196 = mg[, shift(value, n = 1,
type = "lead"), by = id])
## Unit: milliseconds
## expr min lq mean median uq max neval
## dt194 5.161973 5.429927 5.78047 5.698263 5.798132 10.42217 100
## dt196 79.526981 87.914502 92.18144 91.240949 91.896799 266.04031 100
除此之外,使用
:=
也是任务的一部分...
shift
能够超过c(value[-1], NA)
是一个合理的期望。虽然可能有改进的潜力,但基本的R解决方案已经被极度优化,而且一个提供更多灵活性的函数(例如非向量输入)必须会更慢。 - Rolandshift()
会稍微快一些。点击上面的链接查看示例。 - nachti`:=`
。只需运行mg[ , c(value[-1L], NA), by = id]
和mg[ , shift(value, 1, "lead"), id]
即可。 - MichaelChirico