如何用R或Excel中的分组variables计算第95百分位的值

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

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

我审查了这个问题发布 – 每个观察w / r / t分组variables的百分位数。 它似乎非常接近我想要做的,但是这是为了每个观察。 我需要它为每个分组variables。 如此理想,

 Watershed WQ - 95th 50500101 x 50500105 y 

谢谢

这可以使用plyr库来实现。 我们指定分组variablesWatershed并请求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 

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

 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种方法去皮肤 – 我被告知)。 一个侧面说明,你可以指定一个所需的文件的向量,比如c(0.1, 0.2, 0.3...) 0.1,0.2,0.3 c(0.1, 0.2, 0.3...)来表示十进制。 或者你可以尝试一些预定义统计的functionsummary

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

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

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

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

A列为stream域ID,B列为WQ值。

此外,一定要input公式作为数组公式。 input公式时按Ctrl + Shift + Enter即可。

根据Chase的回答,这是一个使用dplyr软件包的解决scheme。 当然,就解决scheme而言,首选是一个问题,我喜欢dplyr使用的“pipe道”( %>% )方法的相对清晰度(对我来说)

 library(dplyr) #Random seed set.seed(42) #Sample data dat <- data.frame(Watershed = sample(letters[1:2], 100, TRUE), WQ = rnorm(100)) #dplyr call dat %>% group_by(Watershed) %>% summarise(WQ95 = quantile(slc, 0.95))