如何在R或Excel中使用分组变量计算第95百分位的值

时间:2011-03-29 13:45:06

标签: excel r variables grouping

我正在尝试计算按分水岭分组的多个水质值的第95百分位数。例如......

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

我回顾了这个问题 - 每个观察的百分位w / r / t分组变量。它看起来非常接近我想做的事情,但它适用于每次观察。我需要为每个分组变量。理想情况下,

Watershed   WQ - 95th
50500101    x
50500105    y

感谢

5 个答案:

答案 0 :(得分:7)

这可以使用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

答案 1 :(得分:5)

我希望我能正确理解你的问题。这是你在找什么?

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)

答案 2 :(得分:4)

使用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))

答案 3 :(得分:3)

在Excel中,您将需要使用数组公式来简化这一过程。我建议如下:

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

A列是Watershed ID,B列是WQ值。

另外,请务必输入公式作为数组公式。输入公式时按Ctrl + Shift + Enter可以这样做。

答案 4 :(得分:0)

使用data.table - 包,您可以这样做:

export type TableProps<T> = {
  contents: T[],
  loadContents: () => Promise<T[]>,
  [key: string]: any
};