如何使用purrr运行函数rowise?

时间:2017-11-23 04:14:44

标签: r 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

1 个答案:

答案 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