Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Remove single dplyr group_by group

Tags:

r

dplyr

In the case where a tibble is grouped by multiple variables in dplyr, is there a way to remove a single grouping variable other than re-specifying the groups without that variable? I'm thinking it would be something like group_by(df, -var, add = TRUE), though that doesn't work.

Example:

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"

This is clearly a trivial example - my actual use case has lots of conditional groupings based on user input and I'd like to just drop one grouping at some point in the function and leave the rest.

like image 268
MeetMrMet Avatar asked Mar 02 '18 08:03

MeetMrMet


2 Answers

One can use also .dots specification and group by all except some. E.g.

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"

Similar information can be found at this post.

like image 111
Volodymyr Avatar answered Sep 29 '22 19:09

Volodymyr


You could make a custom function using dplyr::groups or dplyr::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
like image 29
Moody_Mudskipper Avatar answered Sep 29 '22 19:09

Moody_Mudskipper