我有一個dataframes的列表,我確定它們全部包含至少一行(實際上,一些只包含一行,其他包含給定數量的行),以及他們都有相同的列(名稱和類型)。萬一它很重要,我也肯定在行中的任何地方都沒有NA。rbind.data.frame的性能
的情況下,可以模擬這樣的:
#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),]})
我設置的參數(的隨機化),讓他們接近我的真實情況。
現在,我想統一所有這些數據幀在一個數據幀中。我想用rbind會做的伎倆,就像這樣:
system.time(
result<-do.call(rbind, someParts)
)
現在,我的系統上(這是不是特別慢),與上面的設置,這需要的是system.time的輸出:
user system elapsed
5.61 0.00 5.62
接近254秒(在我的情況下)行數爲200的變量?當然,必須有一種方法來改善這裏的表現?在我的代碼中,我必須經常做類似的事情(它來自多重插補),所以我需要儘可能快地做到這一點。
在我的工作中,我使用來自Dominik的技術將數據框列表組合在一起http://stackoverflow.com/questions/7224938/can-i-rbind-be-parallelized-in-r/8071176#8071176這是相對來說要快得多,因爲它比較大,當我用字符而不是因素讀取原始列表數據時,發現性能更好。使用rbind在比賽上花了很多時間;我猜測這是檢查要添加的因子水平。 – ARobertson 2012-11-29 21:05:14