我有一个包含以下标识符的数据集:rscore,gvkey,sic2,year和cdom。我要做的是根据给定gvkey的所有时间跨度(~1500)的总和rscores计算百分等级,然后根据gvkey计算给定时间跨度和sic2的百分等级。
计算所有时间跨度的百分位数是一个相当快速的过程,但是一旦我加入计算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'
任何加快这一过程的建议都将受到赞赏!
答案 0 :(得分:2)
您可以尝试使用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 package感兴趣,它被称为“下一代plyr”,支持更快的数据存储后端。