我需要计算由多列拆分的大型数据集(> 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行的数据帧)上运行良好,但会导致致命错误&#39;当输入文件有100000行或更多时。所以看起来我的计算机上没有足够的内存来处理这些具有这些功能的大文件。
是否有机会以某种方式优化此类代码?也许ddply
的一些替代方法可以更有效地工作,或者使用将一个函数拆分成几个连续的循环?
答案 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