R - rlang - 使用延迟评估

时间:2017-11-07 15:15:07

标签: r dplyr rlang quosure

尝试解决以下用例:
我有一个完整的数据集(mydf),根据另一组变量组合(dplyr::group_by)的条目,我希望mysplits具有不同的变量集。问题是,我的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()是我拼图中缺失的组成部分。

1 个答案:

答案 0 :(得分:1)

首先,确保您的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))