Переименовать в функции dplyr 0.7+

Мне трудно переименовать столбцы в функции с помощью dplyr. Я уже нашел полезные сообщения о нестандартной оценке и использовании enquo (например, http://dplyr.tidyverse.org/articles/programming.html и Изменение имен результирующих переменных в пользовательской функции dplyr). Конечная цель - использовать функцию для суммирования каждой группы, а затем переименовать столбцы во что-то более значимое, чем исходные имена переменных.

Вот простой пример, который работает за исключением закомментированных строк.

library(tidyverse)

myfunc <- function(df, groupvar, colvar, grouplab, collab) {
  groupvar <- enquo(groupvar)
  colvar <- enquo(colvar)
  grouplab <- enquo(grouplab)  # quo_name instead?
  collab <- enquo(collab)  # quo_name instead?

t <- df %>%
  select(!!groupvar, !!colvar) %>%
  group_by(!!groupvar, !!colvar) %>%
  summarise(
    Frequencies = length(!!colvar),
    Percentages = length(!!colvar) / nrow(df)
    ) %>%
  mutate(
    Frequencies = scales::comma(Frequencies),
    Percentages = scales::percent(Percentages)
    ) #%>%
# rename(
#    (!!grouplab) = !!groupvar,  # add a more descriptive grouping var label
#    (!!collab) = !!colvar)  # add a more descriptive column var label

# Error: unexpected '=' in: rename((!!grouplab) = "

...  # code to create an xtable, print it into LaTeX
}

myfunc <- (df = mtcars, groupvar = gear, colvar = cyl, grouplab = "Vehicle Gears", collab = "Vehicle Cylinders")
# I purposely made grouplab and collab have a space in case that changes anything. 

Вне функций соответствующая часть будет выглядеть просто: mtcars <- mtcars %>% rename("Vehicle Cylinders" = cyl, "Vehicle Gears" = gear)

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

ОБНОВЛЕНИЕ
Вот один из способов сделать это. Я бы предпочел не помещать имена переменных в строки, но я не знаю, как это обойти. Открыт для предложений.

library(tidyverse)
library(xtable)
data(mtcars)

t_groupedfreqprop <- function(df, groupvar, colvar, grouplab, collab, plotname) {
groupvar2 <- rlang::sym(groupvar)
colvar2 <- rlang::sym(colvar)
grouplab <- rlang::sym(grouplab)
collab <- rlang::sym(collab)

t <- df %>%
  select(!!groupvar2, !!colvar2) %>%
  group_by(!!groupvar2, !!colvar2) %>%
  summarise(
    Frequencies = length(!!colvar2),
    Percentages = length(!!colvar2) / nrow(df)
  ) %>%
  mutate(
    Frequencies = scales::comma(Frequencies),
    Percentages = scales::percent(Percentages)
  ) %>%
  rename(
    !!grouplab := !!rlang::sym(groupvar2),
    !!collab := !!rlang::sym(colvar2)
  )

# remainder of function removed
}

t_groupedfreqprop(df = mtcars, groupvar = "gear", colvar = "cyl", grouplab = "Vehicle Gears", collab = "Vehicle Cylinders")

person Daniel    schedule 11.08.2017    source источник


Ответы (2)


Используйте :=, если вы хотите, чтобы имена программно назначались в левой части выражений.

x <- "mpg"
xnew <- "mpg2"
rename(mtcars, !!xnew := !!rlang::sym(x))
person Hong Ooi    schedule 11.08.2017
comment
Спасибо, @Hong Ooi. Работает ли этот метод в функции - т.е. там, где я не жестко кодирую новые имена? - person Daniel; 12.08.2017
comment
Да, это должно работать, но вы должны использовать enquo для цитирования x и xnew, тогда вы можете отменить цитирование. См. Виньетку по программированию в dplyr для получения дополнительной информации о концепции tidyeval. - person cderv; 12.08.2017
comment
Спасибо. Я, должно быть, что-то упускаю ... Преобразование функции в соответствующую часть вызывает ошибку: Ошибка: в символы можно преобразовать только строки. Эта виньетка помогает (cran.r-project.org/ web / packages / rlang / vignettes /), но я все еще не понимаю, как работать внутри функции. t_groupedfreqprop ‹- функция (df, groupvar, grouplab) {groupvar‹ - enquo (groupvar) grouplab ‹- enquo (grouplab) t‹ - df% ›% rename (!! grouplab: = !! rlang :: sym (groupvar)) } t_groupedfreqprop (df = mtcars, groupvar = gear, grouplab = Vehicle Gears) - person Daniel; 12.08.2017

Чтобы переименовать сразу несколько столбцов, вы должны использовать !!!:

x <- c("mpg", "cyl")
xnew <- paste(x, 2, sep = ".")
names(x) <- xnew
rename(mtcars, !!!x)
person caewok    schedule 29.01.2018