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