【问题标题】:R: Percentile calculations on subsets of dataR:对数据子集的百分位数计算
【发布时间】:2013-10-26 15:45:16
【问题描述】:

我有一个数据集,其中包含以下标识符、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'

任何加快该过程的建议将不胜感激!

【问题讨论】:

    标签: r plyr percentile


    【解决方案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 package 感兴趣,它被称为“下一代 plyr”,支持在后端更快的数据存储。

    【讨论】:

    • 感谢您的两个建议!我真的很喜欢 plyr 语法,更多的搜索让我进行了这个速度比较,所以我很确定这最终会很好地工作! r-statistics.com/2013/09/…
    猜你喜欢
    • 2014-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-29
    • 2013-06-20
    • 1970-01-01
    • 2012-11-12
    相关资源
    最近更新 更多