Использование dplyr summaryiseat с индексом столбца
Я заметил, что при поставке индексов столбцов на dplyr::summarize_at
определяется суммарный столбец, исключая столбцы (столбцы) группировки. Интересно, так ли это должно быть, поскольку с помощью этого дизайна, используя правильный индекс столбца, зависит от того, позиционирующий столбец (столбцы) помещены до или после столбцов группировки.
Вот пример:
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’
Обратите внимание на то, как обобщенные столбцы меняются в зависимости от группировки и расположения столбца группировки.
Это то же самое на других платформах? Это ошибка или функция?
Ответы
Ответ 1
с версией 0.7.5
это поведение больше не может быть воспроизведено:
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.
Ответ 2
@docendodiscimus благодарит за это, потому что даже если эта функция была преднамеренной, документация явно не объясняет это, и в моем случае может быть источником ошибок. На самом деле, эта проблема была решена до ответа на другой вопрос, и мой комментарий выше делает это правильно с той же логикой.
В настоящее время возможным решением является предоставление имен вместо индексов. Но все еще можно сделать это с помощью индексов, просто добавив несколько символов .vars = names(.)[3:4]
, как показано ниже:
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