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

时间:2015-04-23 01:24:00

标签: r optimization rstudio plyr correlation

我需要计算由多列拆分的大型数据集(> 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行的数据帧)上运行良好,但会导致致命错误&#39;当输入文件有100000行或更多时。所以看起来我的计算机上没有足够的内存来处理这些具有这些功能的大文件。

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

1 个答案:

答案 0 :(得分:1)

即使ddply行和数据如下所示,我的计算机上的1e7也没有任何问题。总共耗尽约。我的机器上有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