【问题标题】:Grouping on multiple programmatically specified vars in dplyr 0.6 [duplicate]在 dplyr 0.6 中对多个以编程方式指定的变量进行分组 [重复]
【发布时间】:2017-10-25 10:54:43
【问题描述】:

这是新的 dplyr,即将发布。

dplyr programming vignette 给出了一个使用外部函数中指定的分组变量调用group_by 的示例:

my_summarise <- function(df, group_var) {
  df %>%
    group_by(!!group_var) %>%
    summarise(a = mean(a))
}

这在提供单个分组变量时有效。但是,它会因多个变量而失败。

简化示例:

f <- function(x)
{
    group_by(mtcars, !!x)
}

## works
g1 <- "cyl"
f(g1)

## doesn't work
#Error in mutate_impl(.data, dots) : 
#  Column `c("cyl", "gear")` must be length 32 (the number of rows) or one, not 2
g2 <- c("cyl", "gear")
f(g2)

如何在 rlang 框架内解决此问题?

理想情况下,我希望f 的签名保持不变,即我将分组变量指定为单个向量,而不是通过... 参数。

【问题讨论】:

  • 其实f(g1) 也不好用。试试f(g1) %&gt;% summarize(n=n())

标签: r dplyr tidyverse rlang


【解决方案1】:

有一个非常相似的问题:Programming with dplyr using string as input。我只是稍微修改了答案以使用syms!!!

library(rlang)
f <- function(x){
  group_by(mtcars, !!!syms(x))
}

f(c("cyl")) %>% summarise(n())
# A tibble: 3 x 2
    cyl `n()`
  <dbl> <int>
1     4    11
2     6     7
3     8    14

f(c("cyl", "gear")) %>% summarise(n())
# A tibble: 8 x 3
# Groups:   cyl [?]
    cyl  gear `n()`
  <dbl> <dbl> <int>
1     4     3     1
2     4     4     8
3     4     5     2
4     6     3     2
5     6     4     4
6     6     5     1
7     8     3    12
8     8     5     2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-15
    • 2015-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-19
    • 1970-01-01
    相关资源
    最近更新 更多