gpt4 book ai didi

r - 使用 tidyeval 在自制函数中选择函数

转载 作者:行者123 更新时间:2023-12-01 11:13:48 31 4
gpt4 key购买 nike

所以这个例子基本上来自https://tidyeval.tidyverse.org/dplyr.html#patterns-for-single-arguments它工作得很好:

library(tidyverse)
group_mean <- function(df, group_var, summary_var){
group_var <- rlang::enquo(group_var)
summary_var <-rlang::enquo(summary_var)

name <- paste0(rlang::quo_name(summary_var), "_mean")

df %>%
dplyr::group_by(!!group_var) %>%
dplyr::summarise(!!name := mean(!!summary_var, na.rm = TRUE))
}

mtcars %>% group_mean(group_var = cyl, summary_var = disp)
#> # A tibble: 3 x 2
#> cyl disp_mean
#> <dbl> <dbl>
#> 1 4 105.
#> 2 6 183.
#> 3 8 353.

我想,例如有时能够选择中位数而不是平均值,例如将函数名称更改为 group_stat()

最佳答案

你可以这样做。我不太清楚这是如何工作的,但我已经在 library(purrr) 的源代码中看到这种方法用于 as_mapper():

https://github.com/tidyverse/purrr/blob/master/R/as_mapper.R

library(tidyverse)

group_stat <- function(df, group_var, summary_var, .f) {

func <- rlang::as_closure(.f)

group_var <- rlang::enquo(group_var)
summary_var <-rlang::enquo(summary_var)

name <- paste0(rlang::quo_name(summary_var), "_", deparse(substitute(.f)))

df %>%
dplyr::group_by(!!group_var) %>%
dplyr::summarise(!!name := func(!!summary_var, na.rm = TRUE))
}

mtcars %>%
group_stat(group_var = cyl, summary_var = disp, median)
#> # A tibble: 3 x 2
#> cyl disp_median
#> <dbl> <dbl>
#> 1 4 108
#> 2 6 168.
#> 3 8 350.

mtcars %>%
group_stat(group_var = cyl, summary_var = disp, mean)
#> # A tibble: 3 x 2
#> cyl disp_mean
#> <dbl> <dbl>
#> 1 4 105.
#> 2 6 183.
#> 3 8 353.

mtcars %>%
group_stat(group_var = cyl, summary_var = disp, max)
#> # A tibble: 3 x 2
#> cyl disp_max
#> <dbl> <dbl>
#> 1 4 147.
#> 2 6 258
#> 3 8 472

mtcars %>%
group_stat(group_var = cyl, summary_var = disp, min)
#> # A tibble: 3 x 2
#> cyl disp_min
#> <dbl> <dbl>
#> 1 4 71.1
#> 2 6 145
#> 3 8 276.

reprex package 创建于 2019-05-02 (v0.2.1)

关于r - 使用 tidyeval 在自制函数中选择函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55956280/

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