我很难在使用dplyr的函数中重命名列。我已经在非标准评估和使用enquo上找到有用的帖子(例如,http://dplyr.tidyverse.org/articles/programming.html和Changing names of resulting variables in custom dplyr function)。最终目标是使用该函数来汇总每个组,然后将列重命名为比原始变量名称更有意义的内容。在dplyr 0.7+函数中重命名
下面是一个简单的例子,它除了注释掉的行之外都有效。
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)
我必须重新命名的功能与它的外面是如何运作将得到绊倒。有什么建议?我接受建议。
UPDATE
这是一种方法。我宁愿不把变量名称放在字符串中,但不知道在这里绕过它。接受建议。
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")
感谢,@Hong大井。这种技术是否仍然在一个函数中工作 - 也就是说,我没有对新名称进行硬编码? – Daniel
是的,它应该可以工作,但是你必须使用'en''来引用'x'和'xnew',然后你可以Unquote。请参阅'dplyr'中的编程小插曲以了解* tidyeval *概念中的更多信息。 – cderv
谢谢。我仍然必须缺少一些东西......将函数沸腾到相关部分会引发错误:“错误:只能将字符串转换为符号。”这个小插图有助于(https://cran.r-project.org/web/packages/rlang/vignettes/tidy-evaluation.html),但我仍然在如何在一个函数中工作。 t_groupedfreqprop < - 功能(DF,组变量,grouplab){ 组变量< - enquo(组变量) grouplab < - enquo(grouplab) 吨<- df %>% 重命名( !! grouplab:= !! rlang ::符号(groupvar)) } t_groupedfreqprop(df = mtcars,groupvar = gear,grouplab =“Vehicle Gears”) – Daniel