我有一些包含数据的海量数据集,我必须逐步分析和排序。在此之前,我创建了一个这样的函数:
big.data.frame<-read.csv(data)
my.function<-function(big.data.frame){
for(i in 1:100) {
sort/analyze big.data.frame & store into a new data frame: my.df
if(i==1) iteration.result<-my.df
if(i>1) iteration.result<-rbind(my.df,iteration.result)
}
return(iteration.result)
}
使用我的数据运行此功能需要90分钟。它绝对可怕。而我的问题是我陷入了第二个地狱圈,如下所示:How can I prevent rbind() from geting really slow as dataframe grows larger?
现在,我已经从上面链接中@joran的建议和The R Inferno改变了我的代码:
big.data.frame<-read.csv(data)
my.function<-function(big.data.frame){
my.list = vector(mode="list",100)
for(i in 1:100) {
sort/analyze big.data.frame & store into a new data frame: my.df
my.list[[i]]<-my.df
}
result <- do.call(rbind, my.list)
return(result)
}
但是运行这个也需要90分钟。我认为避免增加行的增量应该会有所帮助,但是没有。
注意#1:我需要采取100个步骤。
注意#2:我的数据是存储在数据框中的原始数据集。我需要提取信息,计算和重新构建整个原始数据框。所以每次迭代中的新数据框(我称之为my.df)看起来与原始数据集完全不同。
注意#3:这是summaryRprof()的大部分输出:
$by.total
total.time total.pct self.time self.pct
"my.function " 5010.42 100.00 0.14 0.00
"unlist" 4603.32 91.87 4593.42 91.68
"function1" 2751.96 54.92 0.04 0.00
"function2" 2081.26 41.54 0.02 0.00
"[" 229.72 4.58 0.08 0.00
"[.data.frame" 229.66 4.58 17.60 0.35
"match" 206.96 4.13 206.64 4.12
"%in%" 206.52 4.12 0.28 0.01
"aggregate" 182.76 3.65 0.00 0.00
"aggregate.data.frame" 182.74 3.65 0.04 0.00
"lapply" 177.86 3.55 35.84 0.72
"FUN" 177.82 3.55 68.06 1.36
"mean.default" 38.36 0.77 35.68 0.71
"unique" 31.90 0.64 4.74 0.09
"sapply" 26.34 0.53 0.02 0.00
"as.factor" 25.86 0.52 0.02 0.00
"factor" 25.84 0.52 0.24 0.00
"split" 25.22 0.50 0.10 0.00
"split.default" 25.12 0.50 2.60 0.05
"as.character" 19.30 0.39 19.26 0.38
"aggregate.default" 14.40 0.29 0.00 0.00
"simplify2array" 12.94 0.26 0.02 0.00
"eval" 5.94 0.12 0.10 0.00
"list" 5.16 0.10 5.16 0.10
"NextMethod" 4.04 0.08 4.04 0.08
"transform" 4.04 0.08 0.00 0.00
"transform.data.frame" 4.04 0.08 0.00 0.00
"==" 3.90 0.08 0.02 0.00
"Ops.factor" 3.88 0.08 0.92 0.02
"sort.list" 3.74 0.07 0.12 0.00
"[.factor" 3.62 0.07 0.00 0.00
"match.arg" 3.60 0.07 0.96 0.02
"ifelse" 3.34 0.07 0.66 0.01
"levels" 2.54 0.05 2.54 0.05
"noNA.levels" 2.52 0.05 0.00 0.00
"data.frame" 1.78 0.04 0.52 0.01
"is.numeric" 1.54 0.03 1.54 0.03
"deparse" 1.40 0.03 0.12 0.00
".deparseOpts" 1.28 0.03 0.02 0.00
"formals" 1.24 0.02 1.22 0.02
"as.data.frame" 1.24 0.02 0.00 0.00
注意#4:如果我正确地解释了事情,我看到“unlist”功能需要花费很多时间。我的函数my.function实际上以列表作为参数:
my.function<-function(data,...) {
dots<-list(...)
dots<-unlist(dots)
... etc
}