【问题标题】:How to calculate decile ranks for multiple columns in dataframe?如何计算数据框中多列的等分等级?
【发布时间】:2015-08-14 07:23:47
【问题描述】:

我有一个包含 1465 个观察值和 1074 个变量的数据框。每列是一个日期,每一行是一个不同的股票代码。我需要对每个日期的代码进行排名。

到目前为止,我一直坚持只对数据集中的一列进行排名。在搜索互联网后,大多数来源似乎建议使用cut(X, quantile(X,(0:10)/10, include.lowest=TRUE。我试过了:

DecRanking <- Volume 
DecRanking <- as.data.frame(DecRanking)
DecRanking2 <- NULL

DecRanking2 <- cut(DecRanking[,1], quantile(DecRanking[,1],(0:10)/10),include.lowest=TRUE)
DecRanking2 <- cut(DecRanking$X1.6.1995, quantile(DecRanking$X1.6.1995,(0:10)/10),include.lowest=TRUE)

这给出了错误:'breaks' are not unique。在 unique() 中包含五分位数函数时,它会显示完全错误的输出:

> head(DecRanking2)
[1] (1e+03,1.93e+04] [0,1e+03]        [0,1e+03]        (1e+03,1.93e+04]      [0,1e+03]        (1e+03,1.93e+04]
Levels: [0,1e+03] (1e+03,1.93e+04] (1.93e+04,4.33e+07]

我该如何解决这个问题以及如何实现所有列的计算?

编辑:

 > head(DecRanking)
  X1.6.1995 X1.13.1995 X1.20.1995 X1.27.1995 X2.3.1995 X2.10.1995 X2.17.1995 X2.24.1995 X3.3.1995 X3.10.1995 X3.17.1995
1      4300          0          0       3300      9900        200        200        400      3100          0        700
2         0          0          0          0         0          0          0          0         0          0          0
3         0          0          0          0         0          0          0          0         0          0          0
4     13700       4700      39400       2400     37645      51486      10000      41650       400      12007      22500
5         0          0          0          0         0          0          0          0         0          0          0
6     10300       6500          0       2500      4800       2500          0      15700        20          0          0  

这只是数据的摘录。害怕陈述显而易见的事实 - 数据显然有 1,465 行和 1074 列

【问题讨论】:

  • 你能提供给我们head(DecRanking)的输出吗?
  • 我编辑了我的问题以包含 head(DecRanking) 数据。
  • 如果您的数据是稀疏的(根据头部样本),您可能不会填充所有 10 个十分位数。这就是错误'breaks' are not unique 的原因:您有多个十分位数的值相同为0,并且cut 中的中断不能有重复值。所以你提到了错误的输出。也许你可以举一个正确输出的例子,这样我们就可以弄清楚你想如何处理,例如其中值为 0 并且十分位数 0%、10%、... 40% 都是 0,您的输出应该是什么样的?
  • 查看 dplyr 包,了解如何查找数字列元素的排名。有一个“排名”命令。

标签: r


【解决方案1】:

根据我的评论,不确定您要如何处理没有足够数据来创建不同等分等级的情况。

如果您愿意简单地将范围划分为 10 个大小相等的箱,介于 0 到特定日期的最大值之间,您可以执行以下操作(箱 1 为 0,箱 10 为具有最高值的箱) ):

DecRanking2 <- as.data.frame(lapply(DecRanking, function(x)
    cut(x, 10, labels=paste("Bin", 1:10), include.lowest=TRUE)))

使用仅包含您的示例 6 行数据的 DecRanking,这是输出

> DecRanking2
  X1.6.1995 X1.13.1995 X1.20.1995 X1.27.1995 X2.3.1995 X2.10.1995 X2.17.1995 X2.24.1995 X3.3.1995 X3.10.1995 X3.17.1995
1     Bin 4      Bin 1      Bin 1     Bin 10     Bin 3      Bin 1      Bin 1      Bin 1    Bin 10      Bin 1      Bin 1
2     Bin 1      Bin 1      Bin 1      Bin 1     Bin 1      Bin 1      Bin 1      Bin 1     Bin 1      Bin 1      Bin 1
3     Bin 1      Bin 1      Bin 1      Bin 1     Bin 1      Bin 1      Bin 1      Bin 1     Bin 1      Bin 1      Bin 1
4    Bin 10      Bin 8     Bin 10      Bin 8    Bin 10     Bin 10     Bin 10     Bin 10     Bin 2     Bin 10     Bin 10
5     Bin 1      Bin 1      Bin 1      Bin 1     Bin 1      Bin 1      Bin 1      Bin 1     Bin 1      Bin 1      Bin 1
6     Bin 8     Bin 10      Bin 1      Bin 8     Bin 2      Bin 1      Bin 1      Bin 4     Bin 1      Bin 1      Bin 1

【讨论】:

  • 我会稍微考虑一下你的建议。我认为我的问题的很大一部分是缺乏使用 R 和十分位排名如何工作的知识。另外,老实说,对于没有足够数据来创建不同等分等级的情况,我不知道什么是正确的方法。
  • 互联网上的某个地方有人提出了以下建议:“问题是 quantile() 为 cut() 中使用的中断生成多个值。修改中断可能更好:eps &lt;- .Machine$double.eps #or use something like 1e-10 brks &lt;- quantile(vec, (0:10)/10) + eps*(0:10) cut(vec, brks, include.lowest=TRUE, labels=FALSE) 会这是一个正确的解决方案?
  • 另外,如果它是均匀分布的,你的解决方案将是完美的(即使大致足够)。有没有简单的方法来实现这个?
  • 请定义“平均分布”,因为我相信我的定义可能不同。正如我在评论中所说,最好的方法是让你举一个正确解决方案的例子(可能是手工解决的),这样我们就知道你的想法了。不只是将错误的解决方案显示为您当前的问题
  • 感谢您一直以来的帮助。我现在明白你想从我这里得到什么,很明显我开始这个项目时没有明确定义我需要我的结果来进行统计评估。我会自己澄清这一点,然后在这里发回。
猜你喜欢
  • 2012-01-31
  • 2019-10-10
  • 2021-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-14
  • 2011-08-07
  • 1970-01-01
相关资源
最近更新 更多