【问题标题】:dplyr::group_by_ with character string input of several variable namesdplyr::group_by_ 带有几个变量名的字符串输入
【发布时间】:2015-02-25 14:23:12
【问题描述】:

我正在编写一个函数,要求用户在函数调用中定义一个或多个分组变量。然后使用 dplyr 对数据进行分组,如果只有一个分组变量,它会按预期工作,但我还没有弄清楚如何使用多个分组变量。

例子:

x <- c("cyl")
y <- c("cyl", "gear")
dots <- list(~cyl, ~gear)

library(dplyr)
library(lazyeval) 

mtcars %>% group_by_(x)             # groups by cyl
mtcars %>% group_by_(y)             # groups only by cyl (not gear)
mtcars %>% group_by_(.dots = dots)  # groups by cyl and gear, this is what I want.

我尝试将y 变成与dots 相同的使用:

mtcars %>% group_by_(.dots = interp(~var, var = list(y)))
#Error: is.call(expr) || is.name(expr) || is.atomic(expr) is not TRUE

如何使用用户定义的>1个变量名的输入字符串(如示例中的y)使用dplyr对数据进行分组?

(这个问题在某种程度上与this one 相关,但没有在那里回答。)

【问题讨论】:

  • 这就是为什么你应该开始使用data.table :) as.data.table(mtcars)[, sum(carb), y] j/k。好问题。
  • 有一天我可能会 :) 但现在我会坚持使用 dplyr..

标签: r dplyr


【解决方案1】:

purrrlyr 包 (https://github.com/hadley/purrrlyr) 中的slice_rows() 通过采用列名(字符串)或位置(整数)的向量对data.frame 进行分组:

y <- c("cyl", "gear")
mtcars_grp <- mtcars %>% purrrlyr::slice_rows(y)

class(mtcars_grp)
#> [1] "grouped_df" "tbl_df"     "tbl"        "data.frame"

group_vars(mtcars_grp)
#> [1] "cyl"  "gear"

group_by_() 已被贬值后特别有用。

【讨论】:

    【解决方案2】:

    这里不需要interp,只需使用as.formula将字符串转换为公式即可:

    dots = sapply(y, . %>% {as.formula(paste0('~', .))})
    mtcars %>% group_by_(.dots = dots)
    

    您的interp 方法不起作用的原因是该表达式返回了以下内容:

    ~list(c("cyl", "gear"))
    

    ——不是你想要的。当然,您可以使用sapply interp 而不是y,这类似于使用上面的as.formula

    dots1 = sapply(y, . %>% {interp(~var, var = .)})
    

    不过,其实你也可以直接传y

    mtcars %>% group_by_(.dots = y)
    

    dplyr vignette on non-standard evaluation 更详细地解释了这些方法之间的区别。

    【讨论】:

    • @David 我不会使用它。我只是展示它来回答 OP 的直接问题,即如何将字符向量转换为公式向量。也就是说,存在 差异(公式附带环境),通常 dplyr 文档建议在字符串上使用公式。但是,在这种特殊情况下,环境有点无用。
    • 非常感谢@Konrad-Rudolph 的这篇文章。它为我节省了很多痛苦。我无法理解您的 sapply 功能......“。”是什么?在里面?
    • group_by_ 现在已弃用;您现在可以使用group_by_at(vars(...))。请参阅this answer 到相关问题(请注意,在该答案中调用one_of() 可能是不必要的)。
    猜你喜欢
    • 2022-11-03
    • 1970-01-01
    • 2016-09-30
    • 2023-01-07
    • 2012-06-05
    • 2013-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多