r - Dplyr select 和 group_by 在引用变量方面的区别?

标签 r dplyr

在当前版本的 dplyr 中,select参数可以按值传递:

variable <- "Species"
iris %>% 
    select(variable)

#       Species
#1       setosa
#2       setosa
#3       setosa
#4       setosa
#5       setosa
#6       setosa
#...

但是group_by参数不能按值传递:
iris %>% 
    group_by(variable) %>% 
    summarise(Petal.Length = mean(Petal.Length))

# Error in grouped_df_impl(data, unname(vars), drop) : 
# Column `variable` is unknown

documented dplyr::select behaviour
iris %>% select(Species)

以及记录在案的 documented dplyr::group_by behaviour
iris %>% 
    group_by(Species) %>% 
    summarise(Petal.Length = mean(Petal.Length))
  • 为什么是 selectgroup_by与按值传递参数不同?
  • 为什么是第一个select打电话工作,将来会继续工作吗?
  • 为什么是第一个group_by电话打不通?我想弄清楚 quo() 的组合, enquo()!!我应该用它来让它工作。

  • 我需要这个是因为我想创建一个将分组变量作为输入参数的函数,如果可能的话,分组变量应该作为字符串给出,因为另外两个函数参数已经作为字符串给出。

    最佳答案

    要将字符串作为符号或未计算的代码传递,您必须首先将其解析为符号或 quosure。您可以使用 symparse_expr来自 rlang解析并稍后使用 !!取消引用:

    library(dplyr)
    
    variable <- rlang::sym("Species")
    # variable <- rlang::parse_expr("Species")
    
    iris %>% 
      group_by(!! variable) %>% 
      summarise(Petal.Length = mean(Petal.Length))
    
    !!UQ() 的快捷方式, 取消引用表达式或符号。这允许 variable仅在调用它的范围内进行评估,即 group_by .

    sym之间的区别和 parse_expr什么时候使用哪一个?

    简短的回答:在这种情况下无关紧要。

    长答案:

    符号是引用 R 对象的一种方式,基本上是对象的“名称”。所以sym类似于 as.name在基础 R。parse_expr另一方面将一些文本转换为 R 表达式。这类似于 parse在基础 R 中。

    表达式可以是任何 R 代码,而不仅仅是引用 R 对象的代码。所以你可以解析引用一个R对象的代码,但是你不能把一些随机代码变成sym如果它引用的对象不存在。

    一般来说,你会使用 sym当您的字符串引用一个对象时(尽管 parse_expr 也可以使用),并使用 parse_expr当您尝试解析任何其他 R 代码以进行进一步评估时。

    对于此特定用例,variable应该引用一个对象,因此将其转换为 sym会工作。另一方面,将其解析为表达式也可以,因为这是将要在 group_by 中计算的代码。当被 !! 取消引用时.

    关于r - Dplyr select 和 group_by 在引用变量方面的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45678466/

    相关文章:

    r - 在 dplyr 中过滤和求和行

    r - 在不改变字体大小的情况下控制字体粗细

    r - 根据 R 中另一个 DataFrame 的条件从 DataFrame 中提取值

    r - 创建列以标识组内的最小字符并标记关系

    r - ggplot2 中的多个核密度

    r - 如何在 R 中使用 ff 包合并两个大型 data.frames?

    r - 防止 geom_points 及其对应的标签重叠

    r - 使用 magrittr tee %T>% 运算符会产生错误

    r - 在多列上使用 tidyr 的 pivot_wider 的问题

    r - 一次合并多个列