R: Расчеты процентилей по подмножествам данных

У меня есть набор данных, который содержит следующие идентификаторы: rscore, gvkey, sic2, year и cdom. Что я собираюсь сделать, так это рассчитать процентные ранги на основе суммированных rscore для всех временных интервалов (~ 1500) для данного gvkey, а затем вычислить процентные ранги в заданном временном интервале и sic2 на основе gvkey.

Вычисление процентилей для всех временных интервалов — довольно быстрый процесс, однако, как только я добавлю в вычисление рангов процентилей sic2, это будет довольно медленно, но мы, вероятно, рассматриваем в общей сложности около ~ 65 000 подмножеств. Меня интересует, есть ли возможность ускорить этот процесс.

Данные для одного временного интервала выглядят следующим образом.

gvkey   sic2    cdom    rscoreSum   pct
1187    10  USA 8.00E-02    0.942268617
1265    10  USA -1.98E-01   0.142334654
1266    10  USA 4.97E-02    0.88565478
1464    10  USA -1.56E-02   0.445748247
1484    10  USA 1.40E-01    0.979807985
1856    10  USA -2.23E-02   0.398252565
1867    10  USA 4.69E-02    0.8791019
2047    10  USA -5.00E-02   0.286701209
2099    10  USA -1.78E-02   0.430915371
2127    10  USA -4.24E-02   0.309255308
2187    10  USA 5.07E-02    0.893020421

Код для расчета отраслевых рейтингов приведен ниже и довольно прост.

#generate 2 digit industry SICs percentile ranks
dout <- ddply(dfSum, .(sic2), function(x){
  indPct <- rank(x$rscoreSum)/nrow(x)
  gvkey <- x$gvkey
  x <- data.frame(gvkey, indPct)
})

#merge 2 digit industry SIC percentile ranks with market percentile ranks
dfSum <- merge(dfSum, dout, by = "gvkey")
names(dfSum)[2] <- 'sic2'

Будем признательны за любые предложения по ускорению процесса!


person rwdvc    schedule 26.10.2013    source источник


Ответы (1)


Вы можете попробовать пакет data.table для быстрых операций с относительно большими наборами данных, такими как ваш. Например, моя машина без проблем справляется с этим:

library(data.table)

# Create a dataset like yours, but bigger
n.rows <- 2e6
n.sic2 <- 1e4
dfSum <- data.frame(gvkey=seq_len(n.rows),
                    sic2=sample.int(n.sic2, n.rows, replace=TRUE),
                    cdom="USA",
                    rscoreSum=rnorm(n.rows))

# Now make your dataset into a data.table
dfSum <- data.table(dfSum)

# Calculate the percentiles
# Note that there is no need to re-assign the result
dfSum[, indPct:=rank(rscoreSum)/length(rscoreSum), by="sic2"]

тогда как эквивалент plyr требует времени.

Если вам нравится синтаксис plyr (а мне нравится), вас также может заинтересовать пакет dplyr, который заявлен как «следующее поколение plyr» с поддержкой более быстрых хранилищ данных в серверной части.

person Peyton    schedule 26.10.2013
comment
Спасибо за оба предложения! Мне очень нравится синтаксис plyr, и немного больше поиска привели меня к этому сравнению скорости, поэтому я почти уверен, что это в конечном итоге сработает! r –statistics.com/2013/09/ - person rwdvc; 26.10.2013