我经常在 data.table 中使用回收,例如当我需要对未来几年进行预测时。
我会在未来的每一年重复我的原始数据。
这可能会导致类似的情况:
library(data.table)
dt <- data.table(cbind(1:500000, 500000:1))
dt2 <- dt[, c(.SD, .(year = 1:10)), by = 1:nrow(dt) ]
但我经常需要处理数百万行,以及比这个玩具示例多得多的列。
时间增加..
尝试这个 :
library(data.table)
dt <- data.table(cbind(1:50000000, 50000000:1))
dt2 <- dt[, c(.SD, .(year = 1:10)), by = 1:nrow(dt) ]
我的问题是:有没有更高效的方法来达到这个目的?
谢谢你的帮助 !
编辑 :
对于这个问题的表述,所接受的答案是最完整的(到目前为止),但我意识到我的问题有点棘手。
我会问另一个问题来展示它:data.table高效回收V2 https://stackoverflow.com/questions/59197298/data-table-efficient-recycling-v2
我认为这个问题是交叉连接。没有内置的方法可以在两个数据表之间进行交叉连接(CJ
函数适用于向量),但从讨论来看在这个问题上 https://github.com/Rdatatable/data.table/issues/1717#issuecomment-545758165,这个函数效果很好:
CJDT <- function(...) {
Reduce(function(DT1, DT2) cbind(DT1, DT2[rep(1:.N, each=nrow(DT1))]), list(...))
}
使用您的大型示例,这对我有用:
years = data.table(year = 1:10, key = "year")
setkey(dt)
dt3 = CJDT(dt, years)
您的方法在内存耗尽之前需要更长的时间。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)