R:对数据的子集计算百分(R: Percentile calculations on subsets

2019-10-18 20:35发布

我有一个包含以下标识符,一个rscore,gvkey,SIC2,一年,黄色物质的数据集。 我所希望做的是计算上所有的时间跨度(〜1500)为给定的gvkey总结rscores基于百分等级,然后算出基于gvkey给定的时间的时间跨度和SIC2百分等级。

计算百分所有时间的时间跨度是相当快速的过程,但是一旦我在计算SIC2百分等级是相当缓慢增加,但我们很可能看在共约〜65000集。 我不知道是否有加快这一进程的可能性。

一米时间时间跨度的数据如下所示

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'

任何建议,以加快这一进程,将不胜感激!

Answer 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的”,与在后端更快的数据存储支持。



文章来源: R: Percentile calculations on subsets of data