Передать переменные по имени в функцию, которая вызывает dplyr? - PullRequest
1 голос
/ 08 марта 2019

Я пытаюсь создать функцию, которая будет принимать 2 переменные из набора данных и отображать их различные значения бок о бок, после чего она будет записывать их в файл CSV. Я буду использовать отдельную функцию dplyr для получения уникальных значений.

map_table <- function(df, var1, var2){
  df_distinct <- df %>% distinct(var1, var2)
  write.csv(df_distinct, 'var1.csv')
}

map_table(iris, Species, Petal.Width)

1) map_table (радужная оболочка, вид, лепесток. Ширина) не дает того, что я хочу. Он должен произвести 27 строк данных, вместо этого я получаю 150 строк данных.

2) Как я могу назвать CSV-файл после ввода var1? Поэтому, если var1 = 'Sepal.Length', имя файла должно быть 'Sepal.Length.csv'

Ответы [ 3 ]

2 голосов
/ 08 марта 2019

Если вы хотите передать имена столбцов без кавычек, вам нужно использовать нестандартную оценку . (Подробнее здесь )

deparse(substitute()) даст вам имя для вывода файла.

library(dplyr)

map_table <- function(df, var1, var2){

  file_name <- paste0(deparse(substitute(var1)), ".csv") # file name

  var1 <- enquo(var1) # non-standard eval
  var2 <- enquo(var2) # equo() caputures the expression passed, ie: Species

  df_distinct <- df %>% 
    distinct(!!var1, !!var2) # non-standard eval, !! tells dplyr to use Species

  write.csv(df_distinct, file = file_name)

}

map_table(iris, Species, Petal.Width)
0 голосов
/ 08 марта 2019

1) Ладно, ответ - использовать отдельный_ вместо отличного. И вызываемые переменные должны быть апострофизированы. 2) используйте функцию apply для объединения значений / форматирования строк, а file =

map_table <- function(df, var1, var2){
  df_distinct <- df %>% distinct_(var1, var2)
  write.csv(df_distinct, file = paste(var1,'.csv'))
}

map_table(iris, 'Species', 'Petal.Width')
0 голосов
/ 08 марта 2019

Вы пытаетесь передать столбцы как объекты. Попробуйте вместо этого передать их имена, а затем использовать помощник выбора:

map_table <- function(df, var1, var2){
  df_distinct <- df %>% select(one_of(c(var1, var2)))%>%
      distinct()
  write.csv(df_distinct, 'var1.csv')
}

map_table(iris, 'Species', 'Petal.Width')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...