2016-04-13 37 views
5

Mój zbiór danych zawiera wiele obserwacji dla różnych gatunków. Każdy gatunek ma inną liczbę obserwacji. Poszukuje szybkiego sposobu w R, aby obliczyć średnią z 10% górnych wartości dla danej zmiennej dla każdego gatunku.Jak obliczyć średnią z 10% najlepszych w R

Wymyśliłem, jak uzyskać określoną liczbę wartości (tj. Górne 20 wartości).

clim6 <-setDT(range)[order(species, clim6),.SD[1:20],by=species] 
write.csv(Bioclimlo6, file = "clim6.csv") 

wiem też, że istnieje sposób, aby przyciąć zestawu danych w celu wygenerowania średnią pozostałego zbioru danych, ale nie jestem pewien, jak przycinać tylko dolne 90%.

mean(x, trim = 0, na.rm = FALSE) 
+4

'średnia (X [x> = kwantylu (x, 0,9 na.rm = PRAWDA)], na. rm = TRUE) ' – eipi10

+0

Dlaczego wolisz średnią niż obliczenie 95. percentyla danych? – cxrodgers

Odpowiedz

8

Średnia górnej 10% wartości przy użyciu zasady R:

x = c(1:100,NA) 
mean(x[x>=quantile(x, 0.9, na.rm=TRUE)], na.rm=TRUE) 

średniej górnej 10% wartości, dzięki połączeniu zmiennej:

# Fake data 
dat = data.frame(x=1:100, group=rep(LETTERS[1:3], c(30,30,40))) 

Z dplyr

library(dplyr) 

dat %>% group_by(group) %>% 
    summarise(meanTop10pct = mean(x[x>=quantile(x, 0.9)])) 
group meanTop10pct 
    (fctr)  (dbl) 
1  A   29.0 
2  B   59.0 
3  C   98.5 

z data.table

library(data.table) 

setDT(dat)[, list(meanTop10pct = mean(x[x>=quantile(x, 0.9)])), by=group] 
group meanTop10pct 
1:  A   29.0 
2:  B   59.0 
3:  C   98.5 
+0

Czy jest dodatkowo sposób na uzyskanie dolnego (najniższego) 10% wartości dla danej zmiennej, ponownie grupującej według gatunków? – PGLS

+0

Tak, po prostu wykonaj 'x <= kwantyl (x, 0.1)'. Możesz wybrać 'x' w dowolnym zakresie percentyla używając funkcji' quantile'. – eipi10