【问题标题】:Splice a quosure and format into a list of strings将 quosure 和 format 拼接成字符串列表
【发布时间】:2017-10-31 22:19:21
【问题描述】:

dplyr::left_join(和朋友)中的 by 参数需要一个字符串列表。我的代码已经将感兴趣的变量定义为 quosures 列表,因此我想通过将 quosures 列表转换为字符串列表来避免再次写下该列表。

我四处寻找rlang 文档,但没有找到现有的解决方案。 quo_expr 系列函数可以将 quosures 拼接和转换为单个字符串,但它们不会生成字符串列表:

library(rlang)

# this works
sepal_length <- quo(Sepal.Length)
quo_text(sepal_length)

# this doesnt
sepaldims <- quos(Species, Sepal.Length)
quo_text(sepaldims)

这是一个有用的例子:

library(dplyr)

# group_by accepts a list of quosures
sepaldims <- quos(Species, Sepal.Length)
iris_sepal <- iris %>%
  group_by(!!!sepaldims) %>%
  summarize(sepal_width = mean(Sepal.Width), petal_width = mean(Petal.Width))    
petaldims <- quos(!!!sepaldims, Petal.Length)
iris_petal <- iris %>%
  group_by(!!!petaldims) %>%
  summarize(sepal_width = mean(Sepal.Width), petal_width = mean(Petal.Width))

# but left join expects a list of strings
iris_merge <- left_join(iris_sepal, iris_petal, by = c("Species", "Sepal.Length")) 

【问题讨论】:

    标签: r dplyr rlang


    【解决方案1】:

    我想出的解决方案将quo_text应用于列表:

    quos_text <- function(qs) {
      unlist(lapply(seq_along(qs), function(i) quo_text(qs[[i]])))
    }
    

    现在我们可以处理 quosures 列表了:

    sepaldims <- quos(Species, Sepal.Length)
    petaldims <- quos(!!!sepaldims, Petal.Length)
    
    quos_text(sepaldims)
    quos_text(petaldims)
    quos_text(quos(!!!sepaldims, Petal.Width))
    

    left_join 很满意:

    # these two are equivalent
    iris_merge <- left_join(iris_sepal, iris_petal, by = c("Species", "Sepal.Length"))
    iris_merge2 <- left_join(iris_sepal, iris_petal, by = quos_text(sepaldims))
    

    @Marius 指出我们可以使用一种更简单的形式:

    sapply(qs, quo_text)
    

    这足够短,我可能会使用它内联而不是作为自定义函数。

    【讨论】:

    • 我觉得你的quos_text函数可以简化为sapply(qs, quo_text)
    猜你喜欢
    • 2014-04-19
    • 1970-01-01
    • 2014-11-25
    • 1970-01-01
    • 2018-04-06
    • 2013-10-29
    • 2020-02-21
    • 1970-01-01
    相关资源
    最近更新 更多