r - 其他 data.table 中的查找求和太慢

标签 r data.table

我有一个包含数据 (DT.B) 的 data.table,并且必须根据 DT.A 对值求和。这里是一个MWE,但是由于真实数据有rows.DT超过20M行,所以需要更快。带有新列的 DT.A 是所需的结果。

library(data.table)
set.seed(46)
rows.DT <- 100  # In reality 20E6
DT.A <- data.table(Cat.A=1:rows.DT,
                                     Cat.B.1=sample(1:100, rows.DT, replace=TRUE),
                                     Cat.B.2=sample(1:100, rows.DT, replace=TRUE))
DT.B.1 <- data.table(Cat.B=1:100, data.1=sample(1:10, 100, replace=TRUE), data.2=sample(1:10, 100, replace=TRUE), data.3=sample(1:10, 100, replace=TRUE))
DT.B.2 <- data.table(Cat.B=1:100, data.1=sample(1:10, 100, replace=TRUE), data.2=sample(1:10, 100, replace=TRUE), data.3=sample(1:10, 100, replace=TRUE))
DT.B <- rbind(DT.B.1, DT.B.2); rm(DT.B.1, DT.B.2)

DT.A[, c("sums.1", "sums.2", "sums.3"):=0]
i <- 1
for (i in 1:nrow(DT.A)) {
    DT.A[i, sums.1:=sum(DT.B[Cat.B==Cat.B.1, data.1], DT.B[Cat.B==Cat.B.2, data.1])]
    DT.A[i, sums.2:=sum(DT.B[Cat.B==Cat.B.1, data.2], DT.B[Cat.B==Cat.B.2, data.2])]
    DT.A[i, sums.3:=sum(DT.B[Cat.B==Cat.B.1, data.3], DT.B[Cat.B==Cat.B.2, data.3])]
}

我尝试过的其他方法都失败了,因为计算机耗尽了 RAM(64GB...),所以这也是解决方案的一个限制(DT.B 也很大)。

最佳答案

可能的替代解决方案:

nms1 <- paste0('data.',1:3)
nms2 <- paste0('sums.',1:3)

DT.A.long <- melt(DT.A, id = 1, value.name = 'Cat.B')
DT.A.long[DT.B[, lapply(.SD, sum, na.rm = TRUE), by = Cat.B]
          , on = .(Cat.B)
          , (nms2) := mget(paste0('i.',nms1))
          ][, (nms2) := lapply(.SD, sum, na.rm = TRUE), by = Cat.A, .SDcols = nms2
            ][, dcast(.SD, ... ~ variable, value.var = 'Cat.B')]

关于r - 其他 data.table 中的查找求和太慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49687094/

相关文章:

java - 无法在 OSX 上安装 R JavaGD 包

r - 有条件地用 data.table 替换列值

r - 我什么时候应该使用 setDT() 而不是 data.table() 来创建 data.table?

regex - 从 R 中的字符串中提取日期

r - 为什么要赋值给引用(:=) give different results when running code say two or three times within data. 表格格式?

r - 参数化查询不适用于 SQL Server 2017

r - 新的ion.RangeSlider给Shiny带来了哪些优势?

r - R 文档中哪些标签是强制性的?

r - 使用列模式融化 data.table

r - 读取() : reading table with\r\r\n as newline symbol