删除单个dplyr group_by分组

7
dplyr 中,如果一个 tibble 被多个变量分组,有没有一种方法可以删除单个分组变量,而不重新指定不包含该变量的分组?我认为可以类似这样使用 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"

这只是一个简单的例子 - 我实际的用例有很多基于用户输入的条件分组,我想在函数中某个时刻丢弃一个分组并保留其余部分。

3
我不确定是否可以直接使用 group_byungroup() 实现(因为请注意,ungroup(carb) 也无法工作)。然而,您可以尝试使用 group_by_at()group_by_if() 来处理您的情况。 - Sotos
2
谢谢 - 我会看一下的。我认为我可以使用 group_vars() 保存分组变量,并可能将其编辑后传递给 group_by_at() - MeetMrMet
那是一个好主意。 - Sotos
你们知道 ungroup 函数中的 ... 参数是否被使用了吗?它与相关的帮助文件不一致。 - moodymudskipper
对于 ungroup 来说似乎并非如此- 我甚至不知道 ungroup... 参数。我从未见过它与除 tbl 之外的任何参数一起使用。 - MeetMrMet
3个回答

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

2

除了某些内容外,可以使用.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"

类似的信息可以在这篇帖子中找到。


1
好主意。似乎使用 dplyr 0.7 中的 group_by_at 而不是旧的 SE group_by_ 更为合适。 - MeetMrMet

1

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接