2017-06-02 60 views
-3

我正在處理財務數據集。該數據集具有對應於30k公司的3M行幷包含數字,浮點數,分類,字符串等。在R中找到子集的有效方法

我的算法需要在給定公司的所有行上執行計算。爲此,我使用subset函數來標識相關的行。

但你可以想象這是非常低效的,因爲爲了識別子集,R必須遍歷所有3M行。如果我爲所有30k公司重複這一步驟,R將遍歷數據集30k次,這是非常可怕的。

這樣做的更好方法是以某種方式按公司對數據集進行分組,並且只能訪問所需的行。

我知道我可以在Python使用字典,其中keys將對應於name of company和值將​​的list爲那家公司,從而使我獲得一次性的相關行非常有效地做到這一點。

但我不知道如何在R中做類似的高效存儲/檢索任何幫助/指針,將不勝感激。

+4

對於大型財務數據集,我使用'setkey'或'setkeyv'設置'data.table'。基準測試表明,這是進行計算的最快方式。比Python中的'dplyr'或熊貓更快:https://github.com/Rdatatable/data.table/wiki/Benchmarks-:-Grouping –

+0

另外,通過data.table,您可以一次性使用所有公司的計算'by = company' –

+1

我討厭「開車低調投票」;在我看來,這是大多數優秀的StackOverflow系統的無用功能。我對猜測的猜測是他們正在尋找一個樣本數據集,就像我在前兩行中提供的那樣,或者更詳細地說明每個公司需要進行哪種計算。你說你不需要代碼,但是如果你顯示了你正在用'subset'執行某些通用數據集的工作,那將會是一個更好的問題。 – Aaron

回答

2

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] 
+0

100%同意支持分組支持是最好的方法。我要補充的是,從問題的難度來看,正在使用哪種類型的算法,這可能會影響像'plyr' +'mcmapply'這樣的東西是否有用(例如,有一種複雜的算法可以使操作並行化通過在儘可能多的分組之後進行分割)。 –

+0

在這個階段,以下是我希望在每家公司的行上執行的一些示例:1)「數據清理」,其中涉及多種啓發式方法,如標識缺少數據的行,從特定類別過濾行,使用值過濾行超過/超過某個臨界值,從最初(或最後)的幾行中刪除返回缺失的行,識別丟失的月份等。2)大多數情況下對此乾淨數據應用不同的迴歸技術。 –

+0

@Aaron:謝謝你的回答。 –

相關問題