Используйте%>% с функциями замены, такими как colnames() <-
Как я могу использовать оператор трубы для подключения к функции замены, например 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
Ответы
Ответ 1
Вы можете использовать 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)
Ответ 2
В 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))
Ответ 3
Мы можем добавить суффикс к суммированным переменным, используя аргумент .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