'ddply' 在 RStudio 中导致致命错误 运行 大型数据集的相关性:优化方法?
'ddply' causes a fatal error in RStudio running correlation on a large data set: ways to optimize?
我需要计算由多个列拆分的大型数据集(> 100 万行)的相关性。我尝试将 ddply
和 cor()
函数结合起来:
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
我需要计算由多个列拆分的大型数据集(> 100 万行)的相关性。我尝试将 ddply
和 cor()
函数结合起来:
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