如何用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))