Purrr 映射多个函数和两个输入

Purrr map multiple functions and two inputs

我正在尝试使用 purrr 将多个函数映射到两个输入。下面给出了一个示例,但理想情况下我想将其扩展到更多功能。尝试执行此操作时出现错误,指出未找到输入,但是,即使我尝试在函数列表中命名输入,也无法解决问题。

library(yardstick)
library(tidyverse)

funcs <- list(accuracy = yardstick::accuracy_vec,
              recall = yardstick::recall_vec)

n <- 1000
x <- as.factor(rbinom(n, 1, 0.5))
y <- as.factor(rbinom(n, 1, 0.5))

df <- tibble(true = rep(list(y), 3),
             preds = rep(list(x), 3))

df
#> # A tibble: 3 x 2
#>   true          preds        
#>   <list>        <list>       
#> 1 <int [1,000]> <int [1,000]>
#> 2 <int [1,000]> <int [1,000]>
#> 3 <int [1,000]> <int [1,000]>

df %>% map2_df(.x = true, .y = preds, .f = funcs)
#> Error in map2(.x, .y, .f, ...): object 'true' not found

funcs <- list(accuracy = ~yardstick::accuracy_vec(truth = .x, estimate = .y),
              recall = ~yardstick::recall_vec(truth = .x, estimate = .y))

df %>% map2_df(.x = true, .y = preds, .f = funcs)
#> Error in map2(.x, .y, .f, ...): object 'true' not found

理想情况下我会得到这样的结果:

# A tibble: 3 x 4
  true          preds         accuracy recall
  <list>        <list>           <dbl>  <dbl>
1 <int [1,000]> <int [1,000]>      0.7    0.8
2 <int [1,000]> <int [1,000]>      0.7    0.8
3 <int [1,000]> <int [1,000]>      0.7    0.8

非常感谢任何帮助,TIA

您可以使用嵌套地图:

df %>% 
  mutate(map2_dfr(true, preds, ~map_dfc(funcs, do.call, list(.x, .y))))

当我将数值传递给函数 accuracy_vecrecall_vec 时出现错误。我得到

Error: truth should be a factor but a integer was supplied..

所以我将数据更改为因子。

library(tidyverse)

n <- 1000
x <- rbinom(n, 1, 0.5)
y <- rbinom(n, 1, 0.5)

df <- tibble(true = rep(list(factor(y)), 3),
             preds = rep(list(factor(x)), 3))

其次,管道将 left-hand 端(左轴)的值作为第一个参数传递给 right-hand 端的函数。因此,当您使用 df %>% map2_df(.x = true, .y = preds, .f = funcs) 时,df 被隐式传递。

您可以为 return 小标题编写自定义函数。

funcs <- function(.x, .y) {
  tibble(accuracy = yardstick::accuracy_vec(truth = .x, estimate = .y), 
         recall =   yardstick::recall_vec(truth = .x, estimate = .y))
}

然后使用map2_df得到一个数据帧作为输出。

map2_df(df$true, df$preds, funcs)