首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Purrr映射多个函数和两个输入

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

Stack Overflow用户
提问于 2021-09-13 12:22:53
回答 2查看 456关注 0票数 2

我试图使用purrr将多个函数映射到两个输入。下面给出了一个示例,但理想情况下,我希望将其扩展到更多的函数。在尝试这样做的时候,我得到了一个错误,即输入找不到,但是,即使我尝试在函数列表中命名输入,这也不能纠正问题。

代码语言:javascript
复制
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

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

代码语言:javascript
复制
# 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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-09-13 12:42:58

您可以使用嵌套映射:

代码语言:javascript
复制
df %>% 
  mutate(map2_dfr(true, preds, ~map_dfc(funcs, do.call, list(.x, .y))))
票数 2
EN

Stack Overflow用户

发布于 2021-09-13 12:52:45

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

错误:truth应该是一个因子,但是提供了一个整数。

所以我把数据改为因子。

代码语言:javascript
复制
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))

第二,管道将左手边的值作为第一个参数传递给右边的函数.因此,当您使用df %>% map2_df(.x = true, .y = preds, .f = funcs)时,df将被隐式传递。

您可以编写一个自定义函数来返回tibble。

代码语言:javascript
复制
funcs <- function(.x, .y) {
  tibble(accuracy = yardstick::accuracy_vec(truth = .x, estimate = .y), 
         recall =   yardstick::recall_vec(truth = .x, estimate = .y))
}

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

代码语言:javascript
复制
map2_df(df$true, df$preds, funcs)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69162624

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档