【发布时间】:2016-09-02 02:01:43
【问题描述】:
我正在尝试优化 r 代码的 sn-p 以使用 R 中的 data.table 计算滞后差异。我有两个可行的解决方案,但在我的真实数据(5 亿行数据集)上运行都很慢。我很享受使用 data.table 的速度和效率,但我实现的两种解决方案都很慢(与其他 data.table 操作相比)。
谁能为这个特定任务在 data.table 中更有效的编码实践提供建议?
library(data.table)
set.seed(1)
id <- 1:10
date_samp <- seq.Date(as.Date("2010-01-01"),as.Date("2011-01-01"),"days")
dt1 <-
data.table(id = sample(id,size = 30,replace=T),
date_1 = sample(date_samp,size = 30,replace=T))
setkey(dt1,id,date_1)
### Attempt to get lagged date
## Attempt 1
dt1[,date_diff:=c(0,diff(date_1)),
by=id]
## Attempt 2
## Works but gives warnings
dt1[,date_diff:=NULL]
dt1[,n_group := .N,by=id]
dt1[,date_diff:=c(0,date_1[2:n_group]-date_1[1:(n_group-1)]),
by=id]
【问题讨论】:
-
我也经历过 data.table 的缓慢意外。大多数时候它真的很快。从
[.data.table中的 j 位置调用table函数似乎比从控制台使用时慢得多。 -
@42 我怀疑将 .N 参数与 by=list(x1,x2,x3...) 一起使用会为您提供最快的表格计算...然后您可以重新调整为所需的格式
-
你说得对,
[, .N, by=list(...)]更快。差异很大。当然,在这种规模的例子中并不明显,但在数百万的例子中大约是 100 倍。
标签: r data.table