gpt4 book ai didi

r - 以编程方式删除 dplyr 中的 `group_by` 字段

转载 作者:行者123 更新时间:2023-12-02 11:03:15 26 4
gpt4 key购买 nike

我正在编写接受 data.frame 的函数,然后执行一些操作。我需要从 group_by 标准中添加和减去项目,以便到达我想去的地方。

如果我想向 df 添加 group_by 标准,那非常简单:

library(tidyverse)
set.seed(42)
n <- 10
input <- data.frame(a = 'a',
b = 'b' ,
vals = 1
)

input %>%
group_by(a) ->
grouped

grouped
#> # A tibble: 1 x 3
#> # Groups: a [1]
#> a b vals
#> <fct> <fct> <dbl>
#> 1 a b 1.

## add a group:
grouped %>%
group_by(b, add=TRUE)
#> # A tibble: 1 x 3
#> # Groups: a, b [1]
#> a b vals
#> <fct> <fct> <dbl>
#> 1 a b 1.

## drop a group?

但是如何以编程方式删除我添加的 b 分组,同时保持所有其他分组相同?

最佳答案

这是一种使用 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

更新:下面的方法直接使用 quosured 列名称,而不将它们转换为字符串。我不确定在 tidyeval 范式中哪种方法是“首选”,或者是否还有另一种更理想的方法。

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))

}

关于r - 以编程方式删除 dplyr 中的 `group_by` 字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50237708/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com