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

R 展开两个大数据文件并使用data.table应用?,r,memory,data.table,R,Memory,Data.table,我试图将一个函数应用于两个数据集df1和df2,其中df1包含(a,b),可以是100万行长,df2包含(x,y,z),可以非常大,从~100到>10000。我想对两个数据集的每个组合应用函数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 =

我试图将一个函数应用于两个数据集
df1
df2
,其中
df1
包含
(a,b)
,可以是100万行长,
df2
包含
(x,y,z)
,可以非常大,从~100到>10000。我想对两个数据集的每个组合应用函数
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)

foo下面是一个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
库(data.table)

indxI认为这很有效,非常感谢。然而,为了复制结果,我不得不将
indx
更改为
indx,很高兴它对您有效。关于
CJ
,请查看:@legizeit:我还没有在实际数据中测试代码
CJ
比expand快90%。如文件所述,网格
和data.table中的分组速度更快,我认为正因为如此,它应该可以节省大量时间。是的,这非常快,我只是尝试第一行为1e6行,第二行为100行。但是,
indx
的大小与使用
expand.grid
时大致相同,这并不奇怪,因为它不会延迟创建。我想知道是否有一种方法可以在python和itertools中实现这一点,其中组合是作为迭代器创建的,因此没有内存占用
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