【问题标题】:Remove single dplyr group_by group删除单个 dplyr group_by 组
【发布时间】:2018-03-02 08:08:46
【问题描述】:

如果 tibble 由dplyr 中的多个变量分组,除了重新指定没有该变量的组之外,还有其他方法可以删除单个分组变量吗?我想它会像group_by(df, -var, add = TRUE),虽然这不起作用。

例子:

library(dplyr)

# Works
mtcars %>%
  # Original groups
  group_by(cyl, gear, carb) %>%
  # New groups
  group_by(cyl, gear) %>%
  group_vars() 
# [1] "cyl"  "gear"

# Doesn't work
mtcars %>%
  # Original groups
  group_by(cyl, gear, carb) %>%
  # New groups
  group_by(-carb, add = TRUE) %>%
  group_vars() 
# [1] "cyl"   "gear"  "carb"  "-carb"

这显然是一个微不足道的例子——我的实际用例有很多基于用户输入的条件分组,我想在函数中的某个点删除一个分组,其余的保留。

【问题讨论】:

  • 我不确定这是否可以直接从group_by 甚至ungroup() 完成(因为请注意ungroup(carb) 也不起作用)。不过,您或许可以使用group_by_at()group_by_if() 来处理您的案件
  • 谢谢 - 我会看看那些。我想我可以用group_vars() 保存分组变量,并可能将它的编辑版本传递给group_by_at()
  • 这是个好主意
  • 你们知道是否使用了ungroup... 参数吗?与相关帮助文件不一致。
  • ungroup 似乎不是这样 - 我什至不知道 ungroup... 参数。我从未见过它与任何参数一起使用,除了 tbl

标签: r dplyr


【解决方案1】:

除了一些之外,还可以使用.dots 规范和分组。 例如。

library(dplyr)
ungroup_by <- function(x,...){
  group_by_(x, .dots = group_vars(x)[!group_vars(x) %in% ...])
}

mtcars %>%
  group_by(cyl, gear, carb) %>%
  ungroup_by('cyl') %>%
  group_vars() 
[1] "gear" "carb"

可以在this post找到类似的信息。

【讨论】:

  • 好主意。似乎使用dplyr 0.7 可能使用group_by_at 而不是较旧的SE group_by_ 是合适的。
【解决方案2】:

您可以使用 dplyr::groupsdplyr::group_vars 创建自定义函数:

ungroup_some <- function(x,...){
  grps <- setdiff(group_vars(x),unlist(list(...)))
  group_by(x,.dots= grps)
}

mtcars %>%
  group_by(cyl, gear, carb) %>%
  ungroup_some("carb")

# # A tibble: 32 x 11
# # Groups:   cyl, gear [8]
#     mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
#  * <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#  1  21.0     6 160.0   110  3.90 2.620 16.46     0     1     4     4
#  2  21.0     6 160.0   110  3.90 2.875 17.02     0     1     4     4
#  3  22.8     4 108.0    93  3.85 2.320 18.61     1     1     4     1
#  4  21.4     6 258.0   110  3.08 3.215 19.44     1     0     3     1
#  5  18.7     8 360.0   175  3.15 3.440 17.02     0     0     3     2
#  6  18.1     6 225.0   105  2.76 3.460 20.22     1     0     3     1
#  7  14.3     8 360.0   245  3.21 3.570 15.84     0     0     3     4
#  8  24.4     4 146.7    62  3.69 3.190 20.00     1     0     4     2
#  9  22.8     4 140.8    95  3.92 3.150 22.90     1     0     4     2
# 10  19.2     6 167.6   123  3.92 3.440 18.30     1     0     4     4
# # ... with 22 more rows

【讨论】:

    【解决方案3】:

    ungroup 直接在 dplyr 1.0.8

    中工作
    library(dplyr)
    mtcars %>%
      group_by(cyl, gear, carb) %>%
      ungroup(cyl) 
    # # A tibble: 32 x 11
    # # Groups:   gear, carb [11]
    #      mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
    #    <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
    #  1  21       6  160    110  3.9   2.62  16.5     0     1     4     4
    #  2  21       6  160    110  3.9   2.88  17.0     0     1     4     4
    #  3  22.8     4  108     93  3.85  2.32  18.6     1     1     4     1
    #  4  21.4     6  258    110  3.08  3.22  19.4     1     0     3     1
    #  5  18.7     8  360    175  3.15  3.44  17.0     0     0     3     2
    #  6  18.1     6  225    105  2.76  3.46  20.2     1     0     3     1
    #  7  14.3     8  360    245  3.21  3.57  15.8     0     0     3     4
    #  8  24.4     4  147.    62  3.69  3.19  20       1     0     4     2
    #  9  22.8     4  141.    95  3.92  3.15  22.9     1     0     4     2
    # 10  19.2     6  168.   123  3.92  3.44  18.3     1     0     4     4
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-02
      • 2017-08-16
      相关资源
      最近更新 更多