R - Передача имени столбца через многоточие в R - PullRequest
0 голосов
/ 10 сентября 2018

У меня есть датафрейм, похожий на этот

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

1 Ответ

0 голосов
/ 10 сентября 2018

Мы можем преобразовать элементы в ... в предложения и затем выполнить оценку (!!!)

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