我正在尝试将函数应用于两个数据集df1
and df2
where df1
包含(a, b)
并且可以有 100 万行长,并且df2
包含(x, y, z)
并且可以非常大,从 ~100 到 >10,000。我想应用一个函数foo
对两个数据集的每个组合进行求和,然后对第二个数据集求和。
foo <- function(a, b, x, y, z) a + b + x + y + z
df1 <- data.frame(a = 1:10, b = 11:20)
df2 <- data.frame(x= 1:5, y = 21:25, z = 31:35)
我用来应用此函数的代码(取自@jlhoward此处如何避免 R 中多个变量的多重循环 https://stackoverflow.com/questions/27572050/how-to-avoid-multiple-loops-with-multiple-variables-in-r)
foo.new <- function(p1, p2) {
p1 = as.list(p1); p2 = as.list(p2)
foo(p1$a, p1$b, p2$x, p2$y, p2$z)
}
indx <- expand.grid(indx2 = seq(nrow(df2)), indx1 = seq(nrow(df1)))
result <- with(indx, foo.new(df1[indx1, ], df2[indx2, ]))
sums <- aggregate(result, by = list(rep(seq(nrow(df1)), each = nrow(df2))), sum)
然而,作为df2
变大(>1000)我很快就耗尽了内存来执行result
上面的功能(运行 32GB RAM 的 64 位 PC)。
我读过关于data.table
相当多,但无法评估其中是否有有助于节省内存的功能。可以替代的东西with
并在以下位置创建一个较小的文件result
步骤,或expand.grid
at the index
步骤,创建迄今为止最大的文件。