代码之家  ›  专栏  ›  技术社区  ›  Abdallah Atef

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

  •  2
  • Abdallah Atef  · 技术社区  · 8 年前

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

    我正在尝试编写一个函数,它将dataframe作为第一个参数,同时包含表示该dataframe中列名的任意数量的参数,并使用这些列名对dataframe执行操作。我的函数如下所示:

    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
    
    1 回复  |  直到 8 年前
        1
  •  2
  •   akrun    8 年前

    我们可以把元素转换成 ... !!! )

    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
    

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

    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")