2016-03-28 1 views
3

sagen, dass ich einen Datenrahmen wie dies in R haben:Looping und Anwenden derselben dplyr Funktion zu viele Spalten

df <- data.frame(factor1 = c("A","B","B","C"), 
       factor2 = c("M","F","F","F"), 
       factor3 = c("0", "1","1","0"), 
       value = c(23,32,4,1)) 

ich eine Auswertungsstatistik in dplyr durch eine Variable gruppiert erhalten möchten, wie so (aber mehr kompliziert):

df %>% 
    group_by(factor1) %>% 
    summarize(mean = mean(value)) 

Nun möchte Ich mag diese alle Faktor Spalten tun (man denke an 100 Faktorvariablen). Gibt es eine Möglichkeit, dies innerhalb von dplyr zu tun? Ich dachte auch über eine for Schleife über names(df), aber ich bekomme die Variablen als Zeichenfolgen und group_by() akzeptiert keine Zeichenfolgen.

Antwort

4

Geben Sie einfach Ihre Daten in lange Form.

library(tidyr) 
df %>% gather(key = factor, value = level, -value) %>% 
    group_by(factor, level) %>% 
    summarize(mean = mean(value)) 

# factor level  mean 
#  (chr) (chr) (dbl) 
# 1 factor1  A 23.00000 
# 2 factor1  B 18.00000 
# 3 factor1  C 1.00000 
# 4 factor2  F 12.33333 
# 5 factor2  M 23.00000 
# 6 factor3  0 12.00000 
# 7 factor3  1 18.00000 
+0

Das ist super danke! Wissen Sie, ob Sie dies in einer for-Schleife tun könnten, indem Sie über die Spaltennamen iterieren? Es könnte nützlich sein, eine Liste von Datenrahmen zu haben, eine für jeden Faktor. –

+0

Warum möchten Sie eine Schleife? Wenn Sie eine Liste von Datenframes am Ende haben wollen, nehmen Sie das obige Ergebnis und 'split (result, result $ faktor)' '. – Gregor

+0

Es könnte in anderen Situationen nützlich sein. Ich denke, ich bin generell neugierig, wie Sie Spaltennamen in dplyr verwenden würden, ohne sie zu benennen. Zum Beispiel: 'df%>% Filter (Namen (df) [1] ==" A ")' funktioniert nicht, aber vielleicht etwas ähnliches würde? –