通过名称将变量传递到调用dplyr的函数中?

时间:2019-03-08 06:48:26

标签: r function dplyr parameter-passing non-standard-evaluation

我正在尝试创建一个函数,该函数将从数据集中获取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(iris,Species,Petal.Width)没有产生我想要的东西。它应该产生27行数据,而不是150行数据。

2)如何在输入var1之后命名csv文件? 因此,如果var1 ='Sepal.Length',则文件名应为'Sepal.Length.csv'

3 个答案:

答案 0 :(得分:2)

如果要传递不带引号的列名,则需要使用non-standard evaluation。 (更多here

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)

答案 1 :(得分:0)

您正在尝试将列作为对象传递。尝试传递其名称,然后使用选择助手:

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

答案 2 :(得分:0)

1)好的答案是使用distinct_而不是distinct。并且被调用的变量需要撇号。 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')