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é?
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.
@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