2015-01-22 4 views
21

Как я могу использовать оператора трубы для подключения к функции замены, например colnames()<-?use%>% с функциями замены, такими как 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")) 

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

Ответы здесь начало, но не совсем мой вопрос: Chaining arithmetic operators in dplyr

+1

Вы могли бы назвать свой вклад в '' summarise' - group_by (mtcars, цил)%>% реферирования (disp_mean = среднее (СМЕЩЕНИЕ), hp_mean = средний (л.с.)) 'Хотя я не видеть, как использование 'colnames' - это большая часть перетаскивания. Нужно ли делать каждую мелочь в dplyr? – thelatemail

+3

Я считаю, что в 'dplyr' есть функция' rename() '. Или да, сделайте то, что сказал @thelatemail. –

+5

Или просто используйте 'setNames', как в' group_by (mtcars, cyl)%>% Подводя итог (средний (disp), средний (hp))%>% setNames (., C ("cyl", "disp_mean" «hp_mean»)) ' –

ответ

34

Вы можете использовать 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)

+0

красивый. Я предполагаю, что синтаксис '\' foo <- \ '()' будет работать для любых таких «замещающих» функций. –

10

В 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)) 
2

Мы можем добавить суффикс к обобщенным переменным, используя .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 

 Смежные вопросы

  • Нет связанных вопросов^_^