【问题标题】:Percentile from bins of distributions来自分布箱的百分位数
【发布时间】:2011-08-31 18:13:38
【问题描述】:

我需要找到“90% 样本的最高 bin”。

我有一张这样的桌子:

my_table <- data.frame(matrix(c(122,68,2,0,30,0,0,0,5,79,23,9000), byrow=TRUE, ncol=4))
names(my_table) <- c("0-10","11-20","21-30","31-5000")

bin-header 表示分钟(时间)。

对于第一行,90% 的样本间隔小于或等于“11-20”。 IE。 90% 的样本时间少于 21 分钟。

对于第二行,它小于或等于区间“0-10”。

对于第三行,它小于或等于区间“31-5000”。

我想添加一列“90p-interval”,其中自动找到上述间隔,导致表格如下:

my_table$Perc90 <-  c("11-20","0-10","31-5000")

我的真实表格有成千上万行。

如果有人可以提供帮助,我将非常感激,也感谢为这个出色网站做出贡献的每个人!

/克里斯

【问题讨论】:

  • 如果在单个区间内没有 > 90% 会怎样?说,my_table &lt;- rbind(my_table, c(80, 10, 0, 10))
  • 如果您查看示例数据框中的第一行,就会发生这种情况。提问者找到达到 90%(包括所有之前)的 bin,即正确答案。

标签: r


【解决方案1】:
apply(my_table, 1, function(x) names(x)[
               max( which( c(0,cumsum(x)) < 0.9*sum(x)))
                                      ])
# [1] "11-20"   "0-10"    "31-5000"

【讨论】:

  • 是的,这基本上是我在“John”代码的注释中给出的解决方案。
  • 查看类似的不等式,我想知道 sum(x) 可能为负的情况(显然不是像这种情况下的时间间隔)。想知道是否需要涉及 ecdf() 的解决方案。
  • DWin:我最初想知道这一点——但我们这里有一些预先分箱的数据计数,而不是实际数据值,因此不可能有负计数。如果我们从实际数据值开始,那么 quantile() 函数及其相关函数会更快更好地完成这项工作。其实我想问一下OP:你有你原来的时间值吗?如果你这样做了,与他们一起工作会比使用这组奇怪的集总垃圾箱要好得多。
【解决方案2】:

目前尚不清楚您希望如何从您的答案中确定 90% 的截止值,因此我提供了一个回复,为您提供了与您的示例相匹配的内容。这可确保所选截止值至少为 90%。

my_table$Perc90 <- apply(my_table, 1, function(x) {
    pct <- cumsum(x)/sum(x)
    return(names(x[pct >= 0.9][1]))
    }  )

【讨论】:

  • 可爱。我发现了一个稍微不同的算法。看起来像:cumsum(x)/sum(x)/0.9 -&gt;rowratio 然后选择 rowratio >= 1 的第一个值。 (未选中)
猜你喜欢
  • 2022-01-26
  • 2015-02-17
  • 2022-01-22
  • 1970-01-01
  • 2021-10-25
  • 2017-01-11
  • 1970-01-01
  • 1970-01-01
  • 2013-07-04
相关资源
最近更新 更多