【问题标题】:Pass variables by name into a function that calls dplyr?按名称将变量传递给调用 dplyr 的函数?
【发布时间】:2019-07-30 04:23:56
【问题描述】:

我正在尝试创建一个函数,该函数将从数据集中获取 2 个变量,并将它们的不同值并排映射,然后将输出写入 csv 文件。我将使用 dplyr 的 distinct 函数来获取唯一值。

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'

【问题讨论】:

  • non-standard evaluation (NSE) 是使用dplyr 时的一个众所周知的问题。这是 [2014 年的一个相关问题](我如何告诉 dplyr 中的 select() 它看到的字符串是数据框中的列名);但这里的解决方案更干净,所以这可能不应该是重复关闭的。

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


【解决方案1】:

如果要传递不带引号的列名,则需要使用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)

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 函数调用中也有不带引号的解决方案。
      猜你喜欢
      • 2017-07-21
      • 2014-12-17
      • 2014-08-13
      • 1970-01-01
      • 1970-01-01
      • 2021-05-21
      • 1970-01-01
      • 1970-01-01
      • 2012-04-13
      相关资源
      最近更新 更多