R - rlang - 使用延迟评估

R - rlang - Working with delayed evaluation

正在尝试解决以下用例:
我有一个完整的数据集 (mydf),我想根据另一组变量组合 (mysplits) 的条目使用不同的变量集 dplyr::group_by。问题是,我的 mysplits data.frame 包含变量名称作为字符。

有一个 dplyr::group_by_ 选项,但我希望使用类似于 rlang 功能或类似功能的工具来实现。

mydf <- 
    data.frame(
        var1 = c('x', 'x', 'y', 'y'), 
        var2 = c('y', 'z', 'x', 'z'),
        var3 = c('a', 'b', 'a', 'b'),
        outcome = runif(4),
        stringsAsFactors = F
    )

mysplits <-
     data.frame(
        g1 = c('var1', 'var2'),
        g2 = c('var2', 'var3'),
        stringsAsFactors = F
     )

我正在寻找类似的东西:

dlply(
    .data = mysplits, .variables = (g1, g2),
    function(thissplit){
        group_by(mydf, f(thissplit$g1), f(thissplit$g2)) %>% summarise(mean(outcome))
    }
)

其中 f() 是我的拼图缺失的部分。

首先,确保您的 data.frame 个名称具有字符值而不是因子水平

mysplits <-
  data.frame(
    g1 = c('var1', 'var2'),
    g2 = c('var2', 'var3'), 
    stringsAsFactors=FALSE
  )

然后您可以使用 group_by_at 和字符串来选择列名。例如

group_by_at(mydf, c("var1", "var2")) %>% summarise(mean(outcome))

你可以用不同的方式遍历值映射,但是你可以使用其他 tidyverse 函数而不是 plyr 函数

map2(mysplits$g1, mysplits$g2, ~group_by_at(mydf, c(.x, .y)) %>% summarise(mean(outcome)))

如果你坚持使用 group_by 和 rlang 的东西,你可以用 rlang::sym() 将字符转换为符号,然后用 !! 取消引用那些像

group_by(mydf, !!rlang::sym(thissplit$g1), !!rlang::sym(thissplit$g2)) %>% summarise(mean(outcome))