web-dev-qa-db-fra.com

Utilisation de dplyr summise_at avec un index de colonne

J'ai remarqué qu'en fournissant des indices de colonne à dplyr::summarize_at la colonne à résumer est déterminée en excluant les colonnes de regroupement. Je me demande si c'est ainsi que cela est censé être, car par cette conception, l'utilisation de l'index de colonne correct dépend si les colonnes de résumé sont positionnées avant ou après les colonnes de regroupement.

Voici un exemple:

library(dplyr)
data("mtcars")

# grouping column after summarise columns
mtcars %>% group_by(gear) %>% summarise_at(3:4, mean)
## A tibble: 3 x 3
#   gear     disp       hp
#  <dbl>    <dbl>    <dbl>
#1     3 326.3000 176.1333
#2     4 123.0167  89.5000
#3     5 202.4800 195.6000

# grouping columns before summarise columns
mtcars %>% group_by(cyl) %>% summarise_at(3:4, mean)
## A tibble: 3 x 3
#    cyl        hp     drat
#  <dbl>     <dbl>    <dbl>
#1     4  82.63636 4.070909
#2     6 122.28571 3.585714
#3     8 209.21429 3.229286

# no grouping columns
mtcars %>% summarise_at(3:4, mean)
#      disp       hp
#1 230.7219 146.6875

# actual third & fourth columns
names(mtcars)[3:4]
#[1] "disp" "hp"  

packageVersion("dplyr")
#[1] ‘0.7.2’

Remarquez comment les colonnes résumées changent en fonction du regroupement et de la position de la colonne de regroupement.

Est-ce la même chose sur d'autres plateformes? Est-ce un bug ou une fonctionnalité?

23
docendo discimus

avec la version 0.7.5 ce comportement ne peut plus être reproduit:

  library(dplyr)
  mtcars %>% group_by(gear) %>% summarise_at(3:4, mean)
  # # A tibble: 3 x 3
  #    gear  disp    hp
  #   <dbl> <dbl> <dbl>
  # 1     3  326. 176. 
  # 2     4  123.  89.5
  # 3     5  202. 196. 

  mtcars %>% group_by(cyl) %>% summarise_at(3:4, mean)
  # # A tibble: 3 x 3
  #     cyl  disp    hp
  #   <dbl> <dbl> <dbl>
  # 1     4  105.  82.6
  # 2     6  183. 122. 
  # 3     8  353. 209. 
3
Moody_Mudskipper

@docendodiscimus merci de l'avoir signalé, car même si cette fonctionnalité était intentionnelle, la documentation ne l'explique pas explicitement et dans mon cas pourrait être source d'erreurs . En fait, ce problème a été résolu avant de répondre sur le autre question , et mon commentaire ci-dessus le fait correctement avec la même logique.


À l'heure actuelle, la solution possible consiste à fournir des noms au lieu d'index. Mais on peut toujours le faire en utilisant des index simplement en ajoutant quelques symboles .vars = names(.)[3:4], comme ci-dessous:

mtcars %>% 
  group_by(cyl) %>% 
  summarise_at( .vars = colnames(.)[3:4] , mean)

mtcars %>% 
  group_by(cyl) %>% 
  summarise_at( .vars = names(.)[3:4] , mean)


## A tibble: 3 x 3
#    cyl     disp        hp
#  <dbl>    <dbl>     <dbl>
#1     4 105.1364  82.63636
#2     6 183.3143 122.28571
#3     8 353.1000 209.21429
2
GoGonzo