使用带有两个环境变量的 dplyr 创建一个函数

Create a function with dplyr with two env-variables

我正在尝试在有两个环境变量时编写函数。此小插图有多个示例,其中包含一个环境变量和多个数据变量,但没有包含两个环境变量的示例。 https://dplyr.tidyverse.org/articles/programming.html 我也无法在 https://adv-r.hadley.nz/ 找到解决方案。

例如,我从两个数据框开始。首先,我想加入他们。然后我想计算一些汇总统计数据。我想创建一个可以完成这项工作的功能。 请注意,分组变量(例如州和人员)的数量可能会根据示例而变化。此外,正在求和的变量(例如销售额和利润)也可能发生变化。

# I need a function
Compute = function(df1, df2, grp_vars, compute_vars) {code}

# An interactive solution: 
library(dplyr)


sales_data = data.frame(staffID = rep(1:5, each = 5),
                 state = c(rep('Cal', 13), rep('Wash', 12)),
                 sales = 101:125,
                 profit = 11:35
                 )

sales_data

staff = data.frame(staffID = 1:5,
                   people = c('Al', 'Barb', 'Carol', 'Dave', 'Ellen'))

staff

res1 = sales_data %>% inner_join(staff, by = 'staffID')
res1

res2 = res1 %>% 
  group_by(state, people) %>% summarize(total_sales = sum(sales), total_profit = sum(profit))
res2
If I only needed to summarize the data, this would work:

# From Programming with dplyr
my_summarise <- function(data, group_var, summarise_var) {
  data %>%
    group_by(across({{ group_var }})) %>% 
    summarise(across({{ summarise_var }}, sum, .names = "sum_{.col}"))
}

my_summarise(res1, c(state, people), c(sales, profit))

总结。我需要一个功能, 计算 = 函数 (df1, df2, grp_vars, compute_vars) {code} 当用户选择 joining/grouping 变量和计算变量时,首先连接两个数据框。 其次,计算总数和 return 结果

您可以将第三个参数 by 添加到您的函数定义中,并将连接添加到您的函数中:

library(dplyr)

compute <- function(df1, df2, by, grp_vars, compute_vars) {
  res1 <- df1 %>% 
    inner_join(df2, by = by)  
  
  res1 %>%
    group_by(across({{ grp_vars }})) %>% 
    summarise(across({{ compute_vars }}, sum, .names = "sum_{.col}"), .groups = "drop")
}

compute(sales_data, staff,  'staffID', c(state, people), c(sales, profit))
#> # A tibble: 6 × 4
#>   state people sum_sales sum_profit
#>   <chr> <chr>      <int>      <int>
#> 1 Cal   Al           515         65
#> 2 Cal   Barb         540         90
#> 3 Cal   Carol        336         66
#> 4 Wash  Carol        229         49
#> 5 Wash  Dave         590        140
#> 6 Wash  Ellen        615        165