4 votes

comment ajouter des variables clés à `dplyr::group_map()` ?

J'ai ce qui suit, mais je veux ajouter l'option group_by() clé Species au tibble résultant :

MWE

iris %>% 
  group_by(Species) %>% 
  group_map(~ broom::tidy(lm(Sepal.Length ~ Sepal.Width, data = .x))) %>% 
  bind_rows()

Sortie

# How do I add the grouping key `Species` to this?

  term        estimate std.error statistic  p.value
  <chr>          <dbl>     <dbl>     <dbl>    <dbl>
1 (Intercept)    2.64     0.310       8.51 3.74e-11
2 Sepal.Width    0.690    0.0899      7.68 6.71e-10
3 (Intercept)    3.54     0.563       6.29 9.07e- 8
4 Sepal.Width    0.865    0.202       4.28 8.77e- 5
5 (Intercept)    3.91     0.757       5.16 4.66e- 6
6 Sepal.Width    0.902    0.253       3.56 8.43e- 4

2voto

Jay Points 1879

Vous pouvez utiliser group_modify() au lieu de group_map() .

library(purrr)
library(dplyr)

iris %>% 
   group_by(Species) %>% 
   group_modify(~ broom::tidy(lm(Sepal.Length ~ Sepal.Width, data = .x)))

# A tibble: 6 x 6
# Groups:   Species [3]
  Species    term        estimate std.error statistic  p.value
  <fct>      <chr>          <dbl>     <dbl>     <dbl>    <dbl>
1 setosa     (Intercept)    2.64     0.310       8.51 3.74e-11
2 setosa     Sepal.Width    0.690    0.0899      7.68 6.71e-10
3 versicolor (Intercept)    3.54     0.563       6.29 9.07e- 8
4 versicolor Sepal.Width    0.865    0.202       4.28 8.77e- 5
5 virginica  (Intercept)    3.91     0.757       5.16 4.66e- 6
6 virginica  Sepal.Width    0.902    0.253       3.56 8.43e- 4

1voto

akrun Points 148302

Nous pouvons le faire en summarise retourner un list et unnest le résultat

library(dplyr)
library(tidyr)
iris %>%
    group_by(Species) %>%
    summarise(out = list(broom::tidy(lm(Sepal.Length ~ Sepal.Width, 
           data = cur_data())))) %>% 
    unnest(out)

-sortie

# A tibble: 6 x 6
  Species    term        estimate std.error statistic  p.value
  <fct>      <chr>          <dbl>     <dbl>     <dbl>    <dbl>
1 setosa     (Intercept)    2.64     0.310       8.51 3.74e-11
2 setosa     Sepal.Width    0.690    0.0899      7.68 6.71e-10
3 versicolor (Intercept)    3.54     0.563       6.29 9.07e- 8
4 versicolor Sepal.Width    0.865    0.202       4.28 8.77e- 5
5 virginica  (Intercept)    3.91     0.757       5.16 4.66e- 6
6 virginica  Sepal.Width    0.902    0.253       3.56 8.43e- 4

Sur group_map d'après la documentation, le .y est la clé, que nous pouvons ajouter comme une colonne

iris %>% 
  group_by(Species) %>% 
  group_map(~ broom::tidy(lm(Sepal.Length ~ Sepal.Width, data = .x)) %>% 
           mutate(Species = .y$Species, .before = 1)) %>% 
  bind_rows()

-sortie

# A tibble: 6 x 6
  Species    term        estimate std.error statistic  p.value
  <fct>      <chr>          <dbl>     <dbl>     <dbl>    <dbl>
1 setosa     (Intercept)    2.64     0.310       8.51 3.74e-11
2 setosa     Sepal.Width    0.690    0.0899      7.68 6.71e-10
3 versicolor (Intercept)    3.54     0.563       6.29 9.07e- 8
4 versicolor Sepal.Width    0.865    0.202       4.28 8.77e- 5
5 virginica  (Intercept)    3.91     0.757       5.16 4.66e- 6
6 virginica  Sepal.Width    0.902    0.253       3.56 8.43e- 4

0voto

Ronak Shah Points 24715

Utilisation de split + map_df -

library(dplyr)
library(purrr)

iris %>% 
  split(.$Species) %>% 
  map_df(~ broom::tidy(lm(Sepal.Length ~ Sepal.Width, data=.x)),.id = 'Species')

#  Species    term        estimate std.error statistic  p.value
#  <chr>      <chr>          <dbl>     <dbl>     <dbl>    <dbl>
#1 setosa     (Intercept)    2.64     0.310       8.51 3.74e-11
#2 setosa     Sepal.Width    0.690    0.0899      7.68 6.71e-10
#3 versicolor (Intercept)    3.54     0.563       6.29 9.07e- 8
#4 versicolor Sepal.Width    0.865    0.202       4.28 8.77e- 5
#5 virginica  (Intercept)    3.91     0.757       5.16 4.66e- 6
#6 virginica  Sepal.Width    0.902    0.253       3.56 8.43e- 4

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X