Вот подход, который использует tidyeval, так что в качестве аргументов функции могут использоваться пустые имена столбцов. Я не уверен, имеет ли смысл преобразовывать пустые имена столбцов в текст (как я это сделал ниже) или есть более элегантный способ работать напрямую с пустыми именами столбцов.
drop_groups = function(data, ...) {
groups = map_chr(groups(data), rlang::quo_text)
drop = map_chr(quos(...), rlang::quo_text)
if(any(!drop %in% groups)) {
warning(paste("Input data frame is not grouped by the following groups:",
paste(drop[!drop %in% groups], collapse=", ")))
}
data %>% group_by_at(setdiff(groups, drop))
}
d = mtcars %>% group_by(cyl, vs, am)
groups(d %>% drop_groups(vs, cyl))
[[1]]
am
groups(d %>% drop_groups(a, vs, b, c))
[[1]]
cyl
[[2]]
am
Warning message:
In drop_groups(., a, vs, b, c) :
Input data frame is not grouped by the following groups: a, b, c
ОБНОВЛЕНИЕ: Подход, приведенный ниже, работает непосредственно с именами столбцов в кавычках, без преобразования их в строки. Я не уверен, какой подход является «предпочтительным» в парадигме тидьеваля, или есть ли другой, более желательный метод.
drop_groups2 = function(data, ...) {
groups = map(groups(data), quo)
drop = quos(...)
if(any(!drop %in% groups)) {
warning(paste("Input data frame is not grouped by the following groups:",
paste(drop[!drop %in% groups], collapse=", ")))
}
data %>% group_by(!!!setdiff(groups, drop))
}