r - 用于循环列表的自定义函数

标签 r dplyr custom-function

我有一个有效的自定义函数,但不知道如何让它与输入列表循环。看起来我需要了解 apply() 等,但我对当前的设置还不太了解。该函数使用 rollapply() 查找给定时间范围内的最大指标。

library(zoo)
library(dplyr)

# Data
set.seed(1)
df <- tibble(player = rep(LETTERS[1:2], each = 10),
             minute = rep(1:10, times = 2),
             tdc = sample(100:200,size = 20),
             sumad = sample(1:10, size = 20, replace = TRUE))

# Custom function
x_min_roll <- function(df, metric, n_minutes, fun){
  metric <- ensym(metric)
  newname <- glue::glue("{rlang::as_string(metric)}_x{as.character(n_minutes)}")
  df %>% 
    # dynamically create new column name based on input
    mutate("{newname}" := rollapply(!!metric, n_minutes, fun, align='left', fill=NA)) %>% 
    group_by(player) %>% 
    slice_max(.data[[newname]]) %>% 
    select(player, .data[[newname]])
}

# This works
df %>% 
  x_min_roll(metric = tdc, n_minutes = 2, fun = sum)

# A tibble: 2 x 2
# Groups:   player [2]
  player tdc_x2
  <chr>   <int>
1 A         339
2 B         380

我希望能够做到这一点:

metric_list <- c('tdc', 'sumad')
minutes_list <- c(2,5)

df %>% 
  x_min_roll(metric = metric_list, n_minutes = minutes_list, fun = sum) %>% 
  # maybe a few more steps here.... to get this

# A tibble: 2 x 5
  player tdc_x2 tdc_x5 sumad_x2 sumad_x5
  <chr>   <dbl>  <dbl>    <dbl>    <dbl>
1 A         339    793       20       36
2 B         380    866       19       41

最佳答案

我们可以使用map2来循环遍历两个向量的相应元素

library(purrr)
library(dplyr)
map2(metric_list, minutes_list, 
  ~ df %>%
    x_min_roll(metric = !!.x, n_minutes = .y, fun = sum))

-输出

[[1]]
# A tibble: 2 × 2
# Groups:   player [2]
  player tdc_x2
  <chr>   <int>
1 A         339
2 B         380

[[2]]
# A tibble: 3 × 2
# Groups:   player [2]
  player sumad_x5
  <chr>     <int>
1 A            36
2 B            41
3 B            41

编辑:基于@Onyambu的评论


如果我们想要每个组合,则使用交叉来创建组合

library(tidyr)
crossing(metric_list, minutes_list) %>% 
 pmap(~ df %>% 
      x_min_roll(metric = !!.x, n_minutes = .y, fun = sum))

根据OP的评论,如果我们想合并数据集

crossing(metric_list, minutes_list) %>% 
 pmap(~ df %>% x_min_roll(metric = !!.x, n_minutes = .y, fun = sum)) %>%
    reduce(inner_join, by = 'player')

关于r - 用于循环列表的自定义函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71083591/

相关文章:

r - 在 R (dplyr) 中计算重叠日期

r - 所有可能的组合(顺序)

r - 一元运算符的参数无效 - 错误消息 - 带向量的负 dplyr::select

r - 使用 R 根据现有数据框进行计算创建新数据框

r - 在 R 中编写一个循环,根据相同的连续列值折叠行

r - 使用插入符号进行生存分析(随机生存林)

google-apps-script - 自定义函数在电子表格中不起作用

r - 从数据框中删除命名变量的温和方法

google-apps-script - 如何在自定义函数中求值电子表格公式?

r - geom_hline 或 geom_vline 似乎不接受矢量作为引用线,如果在函数内部调用并使用 facet_grid()