% head-6ren">
gpt4 book ai didi

R:为什么 group_by 即使在使用 quosures 时仍然需要 "do"

转载 作者:行者123 更新时间:2023-12-04 12:11:11 25 4
gpt4 key购买 nike

如何使用户定义的函数与管道和 group_by 一起很好地工作?这是一个简单的函数:

 library(tidyverse)

fun_head <- function(df, column) {
column <- enquo(column)
df %>% select(!!column) %>% head(1)
}

该函数与管道配合得很好,并允许按另一列进行过滤:

 mtcars %>% filter(cyl == 4) %>% fun_head(mpg)

> mpg
1 22.8

但是,相同的管道工作因 group_by 而失败

mtcars %>% group_by(cyl) %>% fun_head(mpg)

Adding missing grouping variables: `cyl`
# A tibble: 1 x 2
# Groups: cyl [1]
cyl mpg
<dbl> <dbl>
1 6 21

在 group_by 之后使用“do”使其工作:

 > mtcars %>% group_by(cyl) %>% do(fun_head(., mpg))
# A tibble: 3 x 2
# Groups: cyl [3]
cyl mpg
<dbl> <dbl>
1 4 22.8
2 6 21
3 8 18.7

应该如何更改该功能,使其与 filter 和 group_by 统一工作而无需“do”?
或者 quosures 与问题无关,而 group_by 只需要使用“do”,因为示例中的函数有多个参数?

最佳答案

这与 quosures 无关。在 fun_head() 中没有非标准评估的情况下,这是同样的问题:

fun_head <- function(df) {df %>% select(mpg) %>% head(1)}
mtcars %>% group_by( cyl ) %>% fun_head()
# Adding missing grouping variables: `cyl`
# # A tibble: 1 x 2
# # Groups: cyl [1]
# cyl mpg
# <dbl> <dbl>
# 1 6 21

如其他问题中所述herehere , do 是允许您将任意函数应用于每个组的连接器。 dplyr 动词如 mutatefilter 不需要 do 的原因是因为它们在内部处理分组数据帧作为特殊情况(参见,例如,the implementation of mutate)。如果您希望自己的函数模拟此行为,则需要区分分组数据框和未分组数据框:

fun_head2 <- function( df )
{
if( !is.null(groups(df)) )
df %>% do( fun_head2(.) )
else
df %>% select(mpg) %>% head(1)
}

mtcars %>% group_by(cyl) %>% fun_head2()
# # A tibble: 3 x 2
# # Groups: cyl [3]
# cyl mpg
# <dbl> <dbl>
# 1 4 22.8
# 2 6 21
# 3 8 18.7

编辑:我想指出 group_by + do 的另一种替代方法是使用 tidyr::nest + purrr::map 代替。回到带有两个参数的原始函数定义:

fhead <- function(.df, .var) { .df %>% select(!!ensym(.var)) %>% head(1) }

以下两个链是等价的(直到行的排序,因为 group_by 按分组变量排序而 nest 不):

# Option 1: group_by + do
mtcars %>% group_by(cyl) %>% do( fhead(., mpg) ) %>% ungroup

# Option 2: nest + map
mtcars %>% nest(-cyl) %>% mutate_at( "data", map, fhead, "mpg" ) %>% unnest

关于R:为什么 group_by 即使在使用 quosures 时仍然需要 "do",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52911519/

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