1

尝试解决以下用例:
我有一个完整的数据集 ( mydf),我想dplyr::group_by根据另一组变量组合 ( mysplits) 的条目使用不同的变量集。问题是,我的mysplitsdata.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()我的谜题中缺少的部分在哪里。

4

1 回答 1

1

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

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

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

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))
于 2017-11-07T15:25:46.177 回答