如何使用 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
我想使用这个数据集
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