r - data.table高效回收V2

标签 r data.table recycle

这是这个问题的后续:data.table efficient recycling

这里的区别是每行的 future 年数不一定相同..

我经常在 data.table 中使用回收,例如当我需要对 future 几年进行预测时。我会在未来的每一年重复我的原始数据。

这可能导致类似的事情:

library(data.table)
dt <- data.table(1:500000, 500000:1, rpois(500000, 240))
dt2 <- dt[, c(.SD, .(year = 1:V3)), by = 1:nrow(dt) ]

但我经常需要处理数百万行和比这个玩具示例中更多的列。时间增加了。试试这个:

library(data.table)
dt <- data.table(1:5000000, 5000000:1, rpois(5000000, 240))
dt2 <- dt[, c(.SD, .(year = 1:V3)), by = 1:nrow(dt) ]

我的问题是:是否有更有效的方法来实现此目的?

感谢您的帮助!

最佳答案

这是另一个答案的略微改进版本。

  • 使用非默认值unlist
  • rep.int 而不是 rep
  • seq_len 而不是 :
  • setDT 而不是 data.table()
  • 使用@Cole 建议的sequence 函数会更好
  • 并通过内部 vecseq 进行进一步的小改进

一起看来会有所不同。

时间...

library(data.table)
f0 = function(dt) {
  dt[, c(.SD, .(year = 1:V3)), by = 1:nrow(dt) ]
}
f1 = function(dt) {
  dt2 <- data.table(
    rep(dt$V1, dt$V3),
    rep(dt$V2, dt$V3),
    rep(dt$V3, dt$V3),
    unlist(lapply(dt$V3, function(x){1:x}))
  )
  dt2
}
f2 = function(dt) {
  dt2 = list(
    V1 = rep.int(dt$V1, dt$V3),
    V2 = rep.int(dt$V2, dt$V3),
    V3 = rep.int(dt$V3, dt$V3),
    year = unlist(lapply(dt$V3, seq_len), recursive=FALSE, use.names=FALSE)
  )
  setDT(dt2)
  dt2
}
f3 = function(dt) {
  ## even better with sequence function suggested by @Cole
  dt2 = list(
    V1 = rep.int(dt$V1, dt$V3),
    V2 = rep.int(dt$V2, dt$V3),
    V3 = rep.int(dt$V3, dt$V3),
    year = sequence(dt$V3)
  )
  setDT(dt2)
  dt2
}
f4 = function(dt) {
  dt[, c(lapply(.SD, rep.int, V3), year = .(sequence(V3)))]
}
f5 = function(dt) {
  dt2 = list(
    V1 = rep.int(dt$V1, dt$V3),
    V2 = rep.int(dt$V2, dt$V3),
    V3 = rep.int(dt$V3, dt$V3),
    year = data.table:::vecseq(rep.int(1L,length(dt$V3)), dt$V3, NULL)
  )
  setDT(dt2)
  dt2
}

论“大”数据

dt <- data.table(1:5000000, 5000000:1, rpois(5000000, 240))
system.time(f0(dt))
#   user  system elapsed 
# 22.100  18.914  40.449 
system.time(f1(dt))
#   user  system elapsed 
# 35.866  15.607  51.475 
system.time(f2(dt))
#   user  system elapsed 
# 22.922   6.839  29.760 
system.time(f3(dt))
#   user  system elapsed 
#  6.509   6.723  13.233 
system.time(f4(dt))
#   user  system elapsed 
# 12.140  14.114  26.254 
system.time(f5(dt))
#   user  system elapsed 
#  6.448   4.057  10.506 

无论如何,您应该尝试改进在扩展数据集上运行的流程,因为也许您一开始就不必扩展它。

例如,在 frollmean 中函数有一个参数 adaptive ,它可以在可变长度窗口上计算滚动平均值,通常要计算该值的人需要先扩展数据。 V3 在您的数据中提醒了很多自适应移动平均线的窗口长度。

关于r - data.table高效回收V2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59197298/

相关文章:

r - 汇总日期并计算平均值

r - R Caret 包中的逻辑回归调整参数网格?

r - 将年月字符串转换为带有间隙的三个月容器 - 如何分配连续的升序值?

ios - UIView不圆角,UITableView单元格回收

r - data.table高效回收

r - 代码优化 - data.table,当前具有多个引用的 for 循环被优化为 data.table

r - 如何在R中按列值范围过滤行?

r - 根据列条件连接两个数据表

r - 按列索引号 data.table R 过滤

Linux脚本cp改变文件名