2017-09-26 1 views
1

Je voudrais faire quelque chose entre muter et résumer.ajouter résumer la sortie au fichier d'origine

Je voudrais calculer une statistique de synthèse sur les groupes, mais conservent les données d'origine comme objet imbriqué. Je suppose que c'est une tâche assez générique, mais je ne peux pas comprendre comment faire sans invoquer une jointure ainsi que le regroupement deux fois. exemple de code ci-dessous:

mtcars %>% 
    group_by(cyl) %>% 
    nest() %>% 
    left_join(mtcars %>% 
       group_by(cyl) %>% 
       summarise(mean_mpg = mean(mpg))) 

qui a produit souhaité sortie:

# A tibble: 3 x 3 
    cyl    data mean_mpg 
    <dbl>    <list> <dbl> 
1  6 <tibble [7 x 10]> 19.74286 
2  4 <tibble [11 x 10]> 26.66364 
3  8 <tibble [14 x 10]> 15.10000 

mais je sens que ce n'est pas la façon de le faire "correct".

Répondre

2

Voici une façon de le faire sans join; Utilisez map_dbl (qui est essentiellement un map avec la sortie viennent être un vecteur de type double) de l'emballage purrr (un membre de la famille tidyverse) pour calculer la moyenne des mpg imbriquée dans la colonne data:

mtcars %>% 
    group_by(cyl) %>% 
    nest() %>% 
    mutate(mean_mpg = map_dbl(data, ~ mean(.x$mpg))) 

# A tibble: 3 x 3 
# cyl    data mean_mpg 
# <dbl>    <list> <dbl> 
#1  6 <tibble [7 x 10]> 19.74286 
#2  4 <tibble [11 x 10]> 26.66364 
#3  8 <tibble [14 x 10]> 15.10000 

Ou vous pouvez calculer mean_mpg avant de nidification, et ajoutez mean_mpg comme l'une des variables de groupe:

mtcars %>% 
    group_by(cyl) %>% 
    mutate(mean_mpg = mean(mpg)) %>% 
    group_by(mean_mpg, add=TRUE) %>% 
    nest() 

# A tibble: 3 x 3 
# cyl mean_mpg    data 
# <dbl> <dbl>    <list> 
#1  6 19.74286 <tibble [7 x 10]> 
#2  4 26.66364 <tibble [11 x 10]> 
#3  8 15.10000 <tibble [14 x 10]>