P Lapointe對data.table
的評論是專注,我認爲你不會找到更好的。作爲比較,我知道的最好的基本R方法是通過分割行索引然後對其進行子集化來製作關鍵字。這比單獨使用子集或分割整個數據幀要快得多。 plyr
與拆分行索引的速度大致相同。 data.table
快了幾個數量級。計時器在我的系統上運行,我沒有費力地進行基準測試。
d <- data.frame(company=factor(rep(1:3e4,100)),
other=round(sample(runif(3e6)),2))
## using subset individually
## 1.8 sec for 10 companies, so ~540 sec total
out0 <- sapply(levels(d$company)[1:10], function(companyi) {
di <- subset(d, company==companyi)
mean(di$other)
})
## ## "standard" way; split the data frame and
## ## the split is prohibitively slow, probably too memory intensive
## ds <- split(d, d$company)
## sapply(ds, function(di) mean(di$other))
## not too bad, but still slow, possibly the best base R method?
## 2.6 sec to do only first 1000 companies, so ~78 sec total
idx <- split(seq_len(nrow(d)), d$company)
out1 <- sapply(idx[1:1000], function(i) mean(d[i,]$other))
## plyr, about the same timing as above
library(plyr)
out2 <- ddply(d[1:1e4,], ~company, summarize, m=mean(other))
## data table is the clear speed demon
## 0.07 sec to do all companies
library(data.table)
DT <- as.data.table(d)
out3 <- DT[, mean(other), keyby=company]
對於大型財務數據集,我使用'setkey'或'setkeyv'設置'data.table'。基準測試表明,這是進行計算的最快方式。比Python中的'dplyr'或熊貓更快:https://github.com/Rdatatable/data.table/wiki/Benchmarks-:-Grouping –
另外,通過data.table,您可以一次性使用所有公司的計算'by = company' –
我討厭「開車低調投票」;在我看來,這是大多數優秀的StackOverflow系統的無用功能。我對猜測的猜測是他們正在尋找一個樣本數據集,就像我在前兩行中提供的那樣,或者更詳細地說明每個公司需要進行哪種計算。你說你不需要代碼,但是如果你顯示了你正在用'subset'執行某些通用數據集的工作,那將會是一個更好的問題。 – Aaron