2016-04-01 10 views
1

Hallo Ich versuche, einen Durchschnittswert einer Variablen in allen Zeilen mit dplyr zu finden. Da dplyr bietet eine komfortable Funktion row_number() genannt, ich dachte, dass ich es so verwenden könnte:Wie berechne ich einen Durchschnittswert mit dplyr in R?

library(dplyr) 

iris %>% 
    tbl_df %>% 
    select(Sepal.Length) %>% 
    mutate(loo_avg=mean(Sepal.Length[-row_number()])) # leave one out average 

Aber das gibt ein Ergebnis wie folgt aus:

Source: local data frame [150 x 2] 

    Sepal.Length loo_avg 
      (dbl) (dbl) 
1   5.1  NaN 
2   4.9  NaN 
3   4.7  NaN 
4   4.6  NaN 
5   5.0  NaN 
6   5.4  NaN 
7   4.6  NaN 
8   5.0  NaN 
9   4.4  NaN 
10   4.9  NaN 
..   ...  ... 

Wie behebe Sie das?

+1

Vielleicht ist das, was Sie suchen: http://StackOverflow.com/Questions/35858876/Calculate-group-mean-while-excluding-current-Observation-using-dplyr/35859197#35859197 – mtoto

+0

@ mtoto That ist ziemlich ordentlich! . Aber ... was, wenn ich kompliziertere Funktionen als den Durchschnitt verwenden möchte? Ich habe gesucht, ob es einen Weg gibt, der Subsetting verwendet. – Alby

+1

siehe den Kommentar von akrun in der verknüpften Frage. – mtoto

Antwort

2

Besonders gefällt mir die data.table Methode:

library(data.table) 

DT <- as.data.table(iris) 

DT[ , loo_avg := DT[-.BY$left_out, mean(Sepal.Length)], 
    by = .(left_out = 1:nrow(DT)) 
    ][,.(Sepal.Length, loo_avg)] 
#  Sepal.Length loo_avg 
# 1:   5.1 5.848322 
# 2:   4.9 5.849664 
# 3:   4.7 5.851007 
# 4:   4.6 5.851678 
# 5:   5.0 5.848993 
# ---      
# 146:   6.7 5.837584 
# 147:   6.3 5.840268 
# 148:   6.5 5.838926 
# 149:   6.2 5.840940 
# 150:   5.9 5.842953 

Beachten Sie, dass dieser Ansatz macht es auch unglaublich einfach, was Sie neben mean in j tun wollen.