【问题标题】:Calculate 95th percentile of values with grouping variable使用分组变量计算值的第 95 个百分位数
【发布时间】:2011-03-29 13:45:05
【问题描述】:

我正在尝试计算按流域分组的多个水质值的第 95 个百分位,例如:

Watershed   WQ
50500101    62.370661
50500101    65.505046
50500101    58.741477
50500105    71.220034
50500105    57.917249

我查看了发布的这个问题 - Percentile for Each Observation w/r/t Grouping Variable。它似乎非常接近我想要做的,但它是为了每次观察。我需要它用于每个分组变量。如此理想,

Watershed   WQ - 95th
50500101    x
50500105    y

【问题讨论】:

    标签: excel r variables grouping


    【解决方案1】:

    这可以使用plyr 库来实现。我们指定分组变量Watershed 并要求 WQ 的 95% 分位数。

    library(plyr)
    #Random seed
    set.seed(42)
    #Sample data
    dat <- data.frame(Watershed = sample(letters[1:2], 100, TRUE), WQ = rnorm(100))
    #plyr call
    ddply(dat, "Watershed", summarise, WQ95 = quantile(WQ, .95))
    

    结果

      Watershed     WQ95
        1         a 1.353993
        2         b 1.461711
    

    【讨论】:

    • 我很想使用daply,因为结果很好地压缩为一个数组,例如daply(dat, .(Watershed), function(x) quantile(x$WQ, 0.95))
    • 数据框在未来聚合和连接回原始数据方面通常更容易使用
    【解决方案2】:

    希望我能正确理解您的问题。这是你要找的吗?

    my.df <- data.frame(group = gl(3, 5), var = runif(15))
    aggregate(my.df$var, by = list(my.df$group), FUN = function(x) quantile(x, probs = 0.95))
    
      Group.1         x
    1       1 0.6913747
    2       2 0.8067847
    3       3 0.9643744
    

    编辑

    根据文森特的回答,

    aggregate(my.df$var, by = list(my.df$group), FUN = quantile, probs  = 0.95)
    

    也有效(你可以用 1001 种方式给猫剥皮——有人告诉过我)。附带说明,您可以指定所需的 -iles 向量,例如 c(0.1, 0.2, 0.3...) 用于十分位数。或者您可以尝试使用函数summary 获取一些预定义的统计信息。

    aggregate(my.df$var, by = list(my.df$group), FUN = summary)
    

    【讨论】:

    • 我以前从未使用过 gl... :)
    【解决方案3】:

    结合使用 tapply 和 quantile 函数。例如,如果您的数据集如下所示:

    DF <- data.frame('watershed'=sample(c('a','b','c','d'), 1000, replace=T), wq=rnorm(1000))
    

    使用这个:

    with(DF, tapply(wq, watershed, quantile, probs=0.95))
    

    【讨论】:

    • Richie:'with' 编辑真的是一种改进吗?我不介意,但我只是想知道您是否觉得这样更优雅,或者是否有实际的技术优势。
    • 我觉得这是一个品味问题,虽然如果你想要它更有活力,它可能有它的优势。
    【解决方案4】:

    在 Excel 中,您将需要使用数组公式来简化此操作。我建议如下:

    {=PERCENTILE(IF($A2:$A6 = Watershed ID, $B$2:$B$6), 0.95)}
    

    A 列是分水岭 ID,B 列是 WQ 值。

    另外,请务必将公式作为数组公式输入。输入公式时按 Ctrl+Shift+Enter 即可。

    【讨论】:

    • 插入分水岭 ID 的值。那只是一个占位符。例如 {=PERCENTILE(IF($A2:$A6 = 50500101, $B$2:$B$6), 0.95)}
    • 如果您对 Watershed ID 使用单元格引用,您可以填写表格中所有 ID 的公式。
    【解决方案5】:

    使用data.table-package 你可以做到:

    set.seed(42)
    #Sample data
    dt <- data.table(Watershed = sample(letters[1:2], 100, TRUE), WQ = rnorm(100))
    
    dt[ ,
        j = .(WQ95 = quantile(WQ, .95, na.rm = TRUE),
        by = Watershed]
    

    【讨论】:

      猜你喜欢
      • 2011-10-10
      • 1970-01-01
      • 2020-02-14
      • 2013-11-09
      • 2022-12-13
      • 2018-09-02
      • 1970-01-01
      • 2014-05-14
      • 2017-03-23
      相关资源
      最近更新 更多