2017-08-11 94 views
3

我很難在使用dplyr的函數中重命名列。我已經在非標準評估和使用enquo上找到有用的帖子(例如,http://dplyr.tidyverse.org/articles/programming.htmlChanging 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") 

回答

2

如果您希望在表達式的LHS上以編程方式指定名稱,請使用:=

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

感謝,@Hong大井。這種技術是否仍然在一個函數中工作 - 也就是說,我沒有對新名稱進行硬編碼? – Daniel

+0

是的,它應該可以工作,但是你必須使用'en''來引用'x'和'xnew',然後你可以Unquote。請參閱'dplyr'中的編程小插曲以瞭解* tidyeval *概念中的更多信息。 – cderv

+0

謝謝。我仍然必須缺少一些東西......將函數沸騰到相關部分會引發錯誤:「錯誤:只能將字符串轉換爲符號。」這個小插圖有助於(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

1

要一次重命名多個列,您必須使用!!!

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