如何使用 purrr 运行 行化函数?

How to run a function rowise using purrr?

我想使用这个数据集

dd <- cross_df(list(p = c(.1, .5, .9), x = c(0:2))) 

# A tibble: 9 x 2
      p     x
  <dbl> <int>
1   0.1     0
2   0.5     0
3   0.9     0
4   0.1     1
5   0.5     1
6   0.9     1
7   0.1     2
8   0.5     2
9   0.9     2

到运行每行一个函数dbinom。例如,第一行是:

binom(x = 0, size = 2, prob = .1)

我正在尝试像这样使用 purrr,但出现错误:

dd %>%  
  map2_dbl(.x = .$p, .y = .$x, ~ dbinom(x = .y, size = 2, prob = .x))
Error: Can't convert a list to function

当你通过管道传输时,第一个参数隐含地是数据框(或任何你正在管道传输的),它不适用于 map 函数,除非你想遍历列(你不要在这里)。相反,要么将其包装在 dplyr:

library(tidyverse)

dd <- cross_df(list(p = c(.1, .5, .9), 
                    x = c(0:2))) 

dd %>% mutate(binom_density = map2_dbl(x, p, dbinom, size = 2))
#> # A tibble: 9 x 3
#>       p     x binom_density
#>   <dbl> <int>         <dbl>
#> 1   0.1     0          0.81
#> 2   0.5     0          0.25
#> 3   0.9     0          0.01
#> 4   0.1     1          0.18
#> 5   0.5     1          0.50
#> 6   0.9     1          0.18
#> 7   0.1     2          0.01
#> 8   0.5     2          0.25
#> 9   0.9     2          0.81

或在大括号中,因此您可以指定数据框的位置 .:

dd %>% {map2_dbl(.$x, .$p, dbinom, size = 2)}
#> [1] 0.81 0.25 0.01 0.18 0.50 0.18 0.01 0.25 0.81

你可以在没有大括号(并且有两个以上参数)的情况下使用的选项是 pmap,它会并行遍历你传递的任何内容,对于数据框来说意味着按行操作:

dd %>% pmap_dbl(~dbinom(..2, ..1, size = 2))
#> [1] 0.81 0.25 0.01 0.18 0.50 0.18 0.01 0.25 0.81