在dplyr 0.7+函数中重命名

5
我在使用dplyr函数时,对于重命名列的操作遇到了困难。我已经找到了关于非标准评估和enquo使用的有用文章(例如:http://dplyr.tidyverse.org/articles/programming.htmlChanging names of resulting variables in custom dplyr function)。最终目的是使用该函数对每个组进行汇总,然后将列重命名为比原始变量名更有意义的名称。
这里是一个简单的示例,它可以正常工作,但是注释行不能正常运行。
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")
2个回答

11

如果您希望在表达式的左侧以编程方式分配名称,请使用:=

x <- "mpg"
xnew <- "mpg2"
rename(mtcars, !!xnew := !!rlang::sym(x))

谢谢,@Hong Ooi。这种技术在函数中仍然有效吗,也就是说,在那里我没有硬编码新名称? - Daniel
是的,它应该能工作,但你必须使用 enquo 引用 xxnew,然后才能取消引用。有关 tidyeval 概念的更多信息,请参见 dplyr 中的编程小册子。 - cderv
谢谢。我可能还是漏了什么...将函数简化为相关部分会抛出错误:"Error: Only strings can be converted to symbols." 这篇文章可以帮助(https://cran.r-project.org/web/packages/rlang/vignettes/tidy-evaluation.html),但我仍然在努力学习如何在函数内部工作。t_groupedfreqprop <- function(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") - Daniel

6

要同时重命名多个列,您需要使用!!!

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接