R - 在 R 中通过省略号传递列名

R - Passing column name through ellipsis in R

我有一个看起来像这样的数据框

df = data.frame(id = 1:10, wt = 71:80, gender = rep(1:2, 5), race = rep(1:2, 5))

我正在尝试编写一个函数,该函数将数据帧作为第一个参数以及代表该数据帧中的列名的任意数量的参数,并使用这些列名对数据帧执行操作。我的函数如下所示:

library(dplyr)
myFunction <- function(df, ...){
 columns <- list(...)
  for (i in 1:length(columns)){
   var <- enquo(columns[[i]])
   df <- df %>% group_by(!!var)
  }
 df2 = summarise(df, mean = mean(wt))
 return(df2)
}

我调用函数如下

myFunction(df, race, gender)

但是,我收到以下错误消息:

Error in myFunction(df, race, gender) : object 'race' not found

我们可以将...中的元素转换为quosures,然后进行求值(!!!)

myFunction <- function(dat, ...){
    columns <- quos(...) # convert to quosures

 dat %>% 
     group_by(!!! columns) %>% # evaluate 
     summarise(mean = mean(wt))

 }

myFunction(df, race, gender)
# A tibble: 2 x 3
# Groups:   race [?]
#   race gender  mean
#  <int>  <int> <dbl>
#1     1      1    75
#2     2      2    76

myFunction(df, race)
# A tibble: 2 x 2
#   race  mean
#  <int> <dbl>
#1     1    75
#2     2    76

注意:在 OP 的示例中,'race' 和 'gender' 是相同的

如果改变它,就会看到不同

df <- data.frame(id = 1:10, wt = 71:80, gender = rep(1:2, 5), 
      race = rep(1:2, each = 5))

myFunction(df, race, gender)
myFunction(df, race)
myFunction(df, gender)

如果我们决定将参数作为带引号的字符串传递,那么我们可以使用 group_by_at

myFunction2 <- function(df, ...) {
 columns <- c(...)
 df %>% 
   group_by_at(columns) %>%
   summarise(mean= mean(wt))

 }

myFunction2(df, "race", "gender")