используйте% ›% с функциями замены, такими как colnames ()‹ -

Как я могу использовать оператор pipe для перенаправления функции замены, такой как colnames()<-?

Вот что я пытаюсь сделать:

library(dplyr)
averages_df <- 
   group_by(mtcars, cyl) %>%
   summarise(mean(disp), mean(hp))
colnames(averages_df) <- c("cyl", "disp_mean", "hp_mean")
averages_df

# Source: local data frame [3 x 3]
# 
#   cyl disp_mean   hp_mean
# 1   4  105.1364  82.63636
# 2   6  183.3143 122.28571
# 3   8  353.1000 209.21429

Но в идеале это было бы что-то вроде:

averages_df <- 
  group_by(mtcars, cyl) %>%
  summarise(mean(disp), mean(hp)) %>%
  add_colnames(c("cyl", "disp_mean", "hp_mean"))

Есть ли способ сделать это, не создавая каждый раз специальную функцию?

Ответы здесь - это начало, но не совсем мой вопрос: Сцепление арифметических операторов в dplyr


person Alex Coppock    schedule 22.01.2015    source источник
comment
Вы можете назвать свои входы summarise - group_by(mtcars, cyl) %>% summarise(disp_mean=mean(disp), hp_mean=mean(hp)) Хотя я не понимаю, насколько использование colnames так затруднительно. Все ли мелочи нужно делать в dplyr?   -  person thelatemail    schedule 23.01.2015
comment
Я считаю, что в dplyr есть rename() функция. Или да, делай то, что сказал @thelatemail.   -  person Rich Scriven    schedule 23.01.2015
comment
Или просто используйте setNames, как в group_by(mtcars, cyl) %>% summarise(mean(disp), mean(hp)) %>% setNames(., c("cyl", "disp_mean", "hp_mean"))   -  person David Arenburg    schedule 23.01.2015
comment
@DavidArenburg - а почему я не подумал об этом, учитывая, что я только что указал на это 2 минуты назад?   -  person thelatemail    schedule 23.01.2015
comment
@thelatemail Я писал "names<-"(., ..., а потом сказал себе подожди минутку ...   -  person David Arenburg    schedule 23.01.2015
comment
Спасибо за эти предложения. Это правда, что не все мелочи нужно делать за dplyr. rename() и setNames решают проблему. Но есть и другие функции замены, которые делают что-то вроде foo(x) <- y. Просто интересно, есть ли у dplyr способ их передать.   -  person Alex Coppock    schedule 23.01.2015
comment
Вы можете использовать такую ​​функцию так же, как показано в ответе Хенрикса.   -  person David Arenburg    schedule 23.01.2015


Ответы (3)


Вы можете использовать colnames<- или setNames (спасибо @David Arenburg)

group_by(mtcars, cyl) %>%
  summarise(mean(disp), mean(hp)) %>%
  `colnames<-`(c("cyl", "disp_mean", "hp_mean"))
  # or
  # `names<-`(c("cyl", "disp_mean", "hp_mean"))
  # setNames(., c("cyl", "disp_mean", "hp_mean")) 

#   cyl disp_mean   hp_mean
# 1   4  105.1364  82.63636
# 2   6  183.3143 122.28571
# 3   8  353.1000 209.21429

Или выберите Alias (set_colnames) из magrittr:

library(magrittr)
group_by(mtcars, cyl) %>%
  summarise(mean(disp), mean(hp)) %>%
  set_colnames(c("cyl", "disp_mean", "hp_mean"))

dplyr::rename может быть более удобным, если вы только (пере) называете несколько столбцов из многих (для этого требуется записать как старое, так и новое имя; см. Ответ @Richard Scriven)

person Henrik    schedule 23.01.2015
comment
красивая. Я предполагаю, что синтаксис `foo<-`() будет работать для любых таких функций замены. - person Alex Coppock; 23.01.2015

В dplyr есть несколько разных способов переименовать столбцы.

Один из них - использовать функцию rename(). В этом примере вам нужно установить обратную галочку для имен, созданных summarise(), поскольку они являются выражениями.

group_by(mtcars, cyl) %>%
    summarise(mean(disp), mean(hp)) %>%
    rename(disp_mean = `mean(disp)`, hp_mean = `mean(hp)`)
#   cyl disp_mean   hp_mean
# 1   4  105.1364  82.63636
# 2   6  183.3143 122.28571
# 3   8  353.1000 209.21429

Вы также можете использовать select(). Это немного проще, потому что мы можем использовать номер столбца, избавляя от необходимости возиться с обратными галочками.

group_by(mtcars, cyl) %>%
    summarise(mean(disp), mean(hp)) %>%
    select(1, disp_mean = 2, hp_mean = 3)

Но для этого примера лучше всего было бы сделать то, что @thelatemail упомянул в комментариях, а именно вернуться на один шаг назад и назвать столбцы в summarise().

group_by(mtcars, cyl) %>%
    summarise(disp_mean = mean(disp), hp_mean = mean(hp))
person Rich Scriven    schedule 23.01.2015

Мы можем добавить суффикс к суммированным переменным, используя .funs аргумент summarise_at с dplyr, как показано ниже.

library(dplyr)

# summarise_at with dplyr
mtcars %>% 
  group_by(cyl) %>%
  summarise_at(
    .cols = c("disp", "hp"),
    .funs = c(mean="mean")
  )
# A tibble: 3 × 3
# cyl disp_mean   hp_mean
# <dbl>     <dbl>     <dbl>
# 1     4  105.1364  82.63636
# 2     6  183.3143 122.28571
# 3     8  353.1000 209.21429

Кроме того, мы можем задать имена столбцов несколькими способами.

# set_names with magrittr
mtcars %>% 
  group_by(cyl) %>%
  summarise(mean(disp), mean(hp)) %>%
  magrittr::set_names(c("cyl", "disp_mean", "hp_mean"))

# set_names with purrr
mtcars %>% 
  group_by(cyl) %>%
  summarise(mean(disp), mean(hp)) %>%
  purrr::set_names(c("cyl", "disp_mean", "hp_mean"))

# setNames with stats
mtcars %>%
  group_by(cyl) %>%
  summarise(mean(disp), mean(hp)) %>%
  stats::setNames(c("cyl", "disp_mean", "hp_mean"))

# A tibble: 3 × 3
# cyl disp_mean   hp_mean
# <dbl>     <dbl>     <dbl>
# 1     4  105.1364  82.63636
# 2     6  183.3143 122.28571
# 3     8  353.1000 209.21429
person Keiku    schedule 26.01.2017