使用字符串作为输入使用dplyr进行编程

时间:2017-05-22 20:36:01

标签: r dplyr

我想写一个在内部使用dplyr的函数,我提供变量名作为字符串。不幸的是,dplyr-s使用NSE使它变得相当复杂。从Programming with dplyr我得到以下示例

my_summarise <- function(df, var) {
  var <- enquo(var)

  df %>%
    group_by(!!var) %>%
    summarise(a = mean(a))
}

my_summarise(df, g1)

但是,我想编写函数而不是g1我可以提供"g1"而我无法解决如何做到这一点。

3 个答案:

答案 0 :(得分:10)

Afaik,您可以使用as.namesym(来自rlang套餐 - 如果dplyr最终导入它,我就不知道了):

library(dplyr)
my_summarise <- function(df, var) {
  var <- rlang::sym(var)
  df %>%
    group_by(!!var) %>%
    summarise(mpg = mean(mpg))
}

my_summarise <- function(df, var) {
  var <- as.name(var)
  df %>%
    group_by(!!var) %>%
    summarise(mpg = mean(mpg))
}

my_summarise(mtcars, "cyl")
# # A tibble: 3 × 2
#     cyl      mpg
#   <dbl>    <dbl>
# 1     4 26.66364
# 2     6 19.74286
# 3     8 15.10000

答案 1 :(得分:0)

使用 rlang 中的.data代词是另一种直接与存储为字符串的列名一起使用的选项。

带有.data的函数看起来像

my_summarise <- function(df, var) {
     df %>%
          group_by(.data[[var]]) %>%
          summarise(mpg = mean(mpg))
}

my_summarise(mtcars, "cyl")
# A tibble: 3 x 2
    cyl   mpg
  <dbl> <dbl>
1     4  26.7
2     6  19.7
3     8  15.1

答案 2 :(得分:0)

我发现自己正为同样的问题而苦苦挣扎。最后,这是仅使用dplyr和基数R中非常有用的as.name函数来完成此操作的方法:

my_summarise <- function(df, var) {
  varName <- as.name(var)
  enquo_varName <- enquo(varName)

  df %>%
    group_by(!!enquo_varName) %>%
    summarise(a = mean(a))
}

my_summarise(df, "g1")

基本上,我们使用as.name()生成一个与var匹配的名称对象(此处var是一个字符串)。然后,在Programming with dplyr之后,我们使用enquo()查看该名称并返回相关的值作为quosure。然后可以使用group_by()!!调用中取消引用此报价。