2011-03-29 739 views
5

我正在嘗試計算按分水嶺分組的多個水質值的第95百分位數。例如...如何計算R或Excel中分組變量的第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 

感謝

回答

4

使用tapply和分位數函數的組合。例如,如果你的數據集是這樣的:

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)) 
+1

Richie:這個'with'編輯真的有改進嗎?我不介意,但我只是想知道你是否覺得它更優雅,或者如果有實際的技術優勢。 – Vincent 2011-03-29 14:21:24

+0

我覺得這是一個品味問題,但如果你想讓它更具動感,它可能會有其優點。 – 2011-03-29 19:25:26

4

我希望我正確地理解你的問題。這是你在找什麼?

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...)的十進制。或者,您可以嘗試使用功能summary獲取某些預定義的統計信息。

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

我以前從未使用過gl ... :) – Vincent 2011-03-29 14:10:14

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 
+0

我很想用'daply',因爲結果很好地壓縮成一個數組,例如'daply(dat,。(Watershed),function(x)分位數(x $ WQ,0.95))'。 – 2011-03-29 14:23:13

+1

數據框通常更容易與未來聚合一起工作,並回到原始數據 – hadley 2011-03-29 17:48:43

3

在Excel中,你會想用數組公式,使這個容易。我建議如下:

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

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

此外,一定要輸入公式作爲數組公式。輸入公式時按Ctrl + Shift + Enter即可。

+0

我得到一個?A2錯誤:$ A6 =流域ID – 2011-03-29 15:48:39

+0

插入流域ID的值。那只是一個佔位符。例如{= PERCENTILE(IF($ A2:$ A6 = 50500101,$ B $ 2:$ B $ 6),0.95)} – Excellll 2011-03-29 16:05:35

+0

如果您使用Watershed ID的單元格引用,則可以填寫所有ID的公式桌子。 – Excellll 2011-03-29 16:08:34

-1

根據Chase的回答,這是一個使用dplyr包的解決方案。

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)) 
0

使用data.table -package你可以這樣做:當然是了「管道化」的dplyr使用(%>%)方法的優先事項儘可能的解決方案,我喜歡相對清晰度(對我來說):

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]