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_vec
和 recall_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)
我正在尝试使用 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_vec
和 recall_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)