繁体   English   中英

展开两个大数据文件并使用data.table应用?

[英]Expand two large data files and apply using data.table?

我试图将函数应用于两个数据集df1df2 ,其中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中有多个变量的多个循环

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.gridindex一步,这是迄今为止创建最大的文件。

这是一个data.table解决方案:应该非常快:

library(data.table)
indx<-CJ(indx1=seq(nrow(df2)),indx2=seq(nrow(df1))) #CJ is data.table function for expand.grid
 indx[,`:=`(result=foo.new(df1[indx1, ], df2[indx2, ]),Group.1=rep(seq(nrow(df1)), each = nrow(df2)))][,.(sums=sum(result)),by=Group.1]

    Group.1 sums
 1:       1  355
 2:       2  365
 3:       3  375
 4:       4  385
 5:       5  395
 6:       6  405
 7:       7  415
 8:       8  425
 9:       9  435
10:      10  445

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM