'ddply' 在 RStudio 中导致致命错误 运行 大型数据集的相关性:优化方法?

'ddply' causes a fatal error in RStudio running correlation on a large data set: ways to optimize?

我需要计算由多个列拆分的大型数据集(> 100 万行)的相关性。我尝试将 ddplycor() 函数结合起来:

func <- function(xx) {
 return(data.frame(corB = cor(xx$ysales, xx$bas.sales), 
                   corA = cor(xx$ysales, xx$tysales)))
}

output <- ddply(input, .(IBD,cell,cat), func)

此代码在相对较小的数据集(具有 1000 行或 10000 行的数据帧)上运行良好,但当输入文件具有 100000 行或更多行时会导致 'fatal error'。所以看起来我的电脑上没有足够的内存来处理这么大的文件。

是否有机会以某种方式优化此类代码?也许 ddply 的某些替代方法更有效,或者使用将一个函数拆分为多个连续函数的循环?

即使有 1e7 行和数据,我的机器上 ddply 也没有任何问题,如下所示。总的来说,它用掉了大约。我的机器上有 1.7 GB。 这是我的代码:

options(stringsAsFactors=FALSE)

#this makes your code reproducible
set.seed(1234)
N_rows=1e7
input=data.frame(IBD=sample(letters[1:5],N_rows,TRUE),
                 cell=sample(letters[1:5],N_rows,TRUE),
                 cat=sample(letters[1:5],N_rows,TRUE),
                 ysales=rnorm(N_rows),
                 tysales=rnorm(N_rows),
                 bas.sales=rnorm(N_rows))

#your solution
library(plyr)

func <- function(xx) {
  return(data.frame(corB = cor(xx$ysales, xx$bas.sales), 
                    corA = cor(xx$ysales, xx$tysales)))
}

output <- ddply(input, .(IBD,cell,cat), func)

但是,如果您的问题比我的示例数据更复杂,您可以尝试 data.table 包。这里有一些代码(请注意,我不是 data.table 的重度用户,下面的代码可能效率低下)

library(data.table)

input_dt=data.table(input)

output_dt=unique(input_dt[,`:=`(corB=cor(.SD$ysales,.SD$bas.sales),
                                corA=cor(.SD$ysales,.SD$tysales))
                          ,by=c('IBD','cell','cat')]
                 [,c('IBD','cell','cat','corB','corA'),with=FALSE])

output_dt=output_dt[order(output_dt$IBD,output_dt$cell,output_dt$cat)]

结果相同

all.equal(data.table(output),output_dt)
#[1] TRUE

head(output_dt,3)

#   IBD cell cat          corB          corA
#1:   a    a   a -6.656740e-03 -0.0050483282
#2:   a    a   b  4.758460e-03  0.0051115833
#3:   a    a   c  1.751167e-03  0.0036150088