Подтвердить что ты не робот

Использование 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’

Обратите внимание на то, как обобщенные столбцы меняются в зависимости от группировки и расположения столбца группировки.

Это то же самое на других платформах? Это ошибка или функция?

4b9b3361

Ответ 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