我想使用此数据集
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
答案 0 :(得分:4)
当你进行管道传输时,第一个参数隐含地是数据框(或者你输入的任何内容),除了你想要遍历列之外,它对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