Как рассчитать 95-й процентиль значений с группировкой переменной в R или Excel - PullRequest
6 голосов
/ 29 марта 2011

Я пытаюсь рассчитать 95-й процентиль для нескольких значений качества воды, сгруппированных по водоразделу.например ...

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

я рассмотрел этот вопрос, опубликованный - процентиль для каждого наблюдения с переменной группировки.кажется, очень близко к тому, что я хочу сделать, но это для КАЖДОГО наблюдения.Мне это нужно для каждой переменной группировки.так в идеале,

Watershed   WQ - 95th
50500101    x
50500105    y

спасибо

Ответы [ 5 ]

7 голосов
/ 29 марта 2011

Этого можно достичь с помощью библиотеки plyr. Мы указываем группирующую переменную Watershed и запрашиваем 95-процентный квантиль WQ.

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
5 голосов
/ 29 марта 2011

Надеюсь, я правильно понял ваш вопрос. Это то, что вы ищете?

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

EDIT

На основании ответа Винсента,

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

также работает (вы можете убрать кошку 1001 способом - мне сказали). Примечание: вы можете указать вектор желаемых символов, например, c(0.1, 0.2, 0.3...) для децилей. Или вы можете попробовать функцию summary для некоторой предопределенной статистики.

aggregate(my.df$var, by = list(my.df$group), FUN = summary)
4 голосов
/ 29 марта 2011

Используйте комбинацию функций 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 голосов
/ 29 марта 2011

В Excel вы захотите использовать формулу массива, чтобы упростить эту задачу.Я предлагаю следующее:

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

Столбец A будет идентификатором водосбора, а столбец B будет значением WQ.

Кроме того, обязательно вводите формулу в виде формулы массива.Сделайте это, нажав Ctrl + Shift + Enter при вводе формулы.

0 голосов
/ 02 февраля 2018

Используя пакет data.table , вы можете сделать:

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]
...