我有一些代码,在一个地方最终得到一个数据帧列表,我真的想转换为一个大数据帧.
我从之前的一个问题中得到了一些指示,这个问题试图做类似但更复杂的事情.
这是我开始的一个例子(为了说明,这是非常简化的):
listOfDataFrames <- vector(mode = "list", length = 100)
for (i in 1:100) {
listOfDataFrames[[i]] <- data.frame(a=sample(letters, 500, rep=T),
b=rnorm(500), c=rnorm(500))
}
Run Code Online (Sandbox Code Playgroud)
我目前正在使用这个:
df <- do.call("rbind", listOfDataFrames)
Run Code Online (Sandbox Code Playgroud) 我正在阅读文档,data.table并且还注意到了一些关于SO的对话,这些对话rbindlist应该比我更好rbind.
我想知道为什么rbindlist比真正优秀的rbind场景更好?rbindlistrbind
在内存利用方面有什么优势吗?
当我坐在这里等待一些R脚本运行...我想知道...有没有办法在R中并行化rbind?
当我处理大量数据时,我坐着等待这个电话频繁完成.
do.call("rbind", LIST)
Run Code Online (Sandbox Code Playgroud) 我有一个数据框列表,我确信它们都至少包含一行(事实上,有些行只包含一行,其他行包含给定数量的行),并且它们都具有相同的列(名称和类型).如果重要的话,我也确定行中的任何地方都没有NA.
情况可以像这样模拟:
#create one row
onerowdfr<-do.call(data.frame, c(list(), rnorm(100) , lapply(sample(letters[1:2], 100, replace=TRUE), function(x){factor(x, levels=letters[1:2])})))
colnames(onerowdfr)<-c(paste("cnt", 1:100, sep=""), paste("cat", 1:100, sep=""))
#reuse it in a list
someParts<-lapply(rbinom(200, 1, 14/200)*6+1, function(reps){onerowdfr[rep(1, reps),]})
Run Code Online (Sandbox Code Playgroud)
我已设置参数(随机化),以便它们接近我的真实情况.
现在,我想在一个数据帧中统一所有这些数据帧.我认为使用rbind可以做到这一点,就像这样:
system.time(
result<-do.call(rbind, someParts)
)
Run Code Online (Sandbox Code Playgroud)
现在,在我的系统上(这不是特别慢),并且使用上面的设置,这需要system.time的输出:
user system elapsed
5.61 0.00 5.62
Run Code Online (Sandbox Code Playgroud)
rbind-ing 254(在我的情况下)200行变量的行近6秒?当然必须有一种方法来改善这里的表现?在我的代码中,我必须经常做类似的事情(这是来自多个插补),所以我需要尽可能快.