使用带有两个环境变量的 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
我正在尝试在有两个环境变量时编写函数。此小插图有多个示例,其中包含一个环境变量和多个数据变量,但没有包含两个环境变量的示例。 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