2017-10-10 5 views
1

Laissez df notre cadre de données de test:R - moyen efficace pour appliquer la fonction sur toutes les fonctions regroupées en utilisant plyr

set.seed(1) 
df <- data.frame(id = c(1,1,2,2,3,3,3), 
       var1 = round(runif(7)), 
       var2 = round(runif(7)), 
       var3 = round(runif(7))) 
df 

    id var1 var2 var3 
1 1 0 1 1 
2 1 0 1 0 
3 2 1 0 1 
4 2 1 0 1 
5 3 0 0 0 
6 3 1 1 1 
7 3 1 0 1 

Je veux résumer sur l'id et résumer toutes les valeurs comme ceci:

df %>% 
    group_by(id) %>% 
    summarise(sum_var_1 = sum(var1), 
      sum_var_2 = sum(var2), 
      sum_var_3 = sum(var3)) %>% 
    data.frame 

    id sum_var_1 sum_var_2 sum_var_3 
1 1   0   2   1 
2 2   2   0   2 
3 3   2   1   2 

Maintenant la question: Y at-il un moyen d'éviter l'étape sum_var_2 = sum(var2) [...] et le faire fonctionnellement à l'intérieur du summarise avec quelque chose comme une formule ou plus? Comme il y a des centaines de fonctionnalités que j'aimerais résumer!

Toute aide serait très appréciée!

Répondre

2

puisque toutes vos variables commencent par "var" vous pouvez faire

df %>% 
    group_by(id) %>% 
    summarise_at(vars(starts_with("var")), sum) 

qui retourne votre exemple.

Edit: Comme @ jake-Kaupp a commenté, summarise_all fait le travail encore mieux et ne nécessite pas les noms de variables à normaliser:

df %>% 
    group_by(id) %>% 
    summarise_all(sum) 
+2

Vous pouvez également utiliser 'summarise_all' qui résumera tout sauf la regrouper les variables. –