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

Chr*_*lla 7 variables excel grouping r

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

Watershed   WQ
50500101    62.370661
50500101    65.505046
50500101    58.741477
50500105    71.220034
50500105    57.917249
Run Code Online (Sandbox Code Playgroud)

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

Watershed   WQ - 95th
50500101    x
50500105    y
Run Code Online (Sandbox Code Playgroud)

谢谢

Cha*_*ase 8

这可以使用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))
Run Code Online (Sandbox Code Playgroud)

和结果

  Watershed     WQ95
    1         a 1.353993
    2         b 1.461711
Run Code Online (Sandbox Code Playgroud)


Vin*_*ent 5

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

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

用这个:

with(DF, tapply(wq, watershed, quantile, probs=0.95))
Run Code Online (Sandbox Code Playgroud)


Rom*_*rik 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
Run Code Online (Sandbox Code Playgroud)

编辑

根据文森特的回答,

aggregate(my.df$var, by = list(my.df$group), FUN = quantile, probs  = 0.95)
Run Code Online (Sandbox Code Playgroud)

也工作(你可以1001种方式给猫皮肤 - 我被告知).旁注,您可以指定所需数量的向量,例如c(0.1, 0.2, 0.3...)十分位数.或者您可以尝试summary使用某些预定义统计信息.

aggregate(my.df$var, by = list(my.df$group), FUN = summary)
Run Code Online (Sandbox Code Playgroud)