purrr map2(x,y,fun),但对于X的每个元素,请执行y的所有元素

时间:2017-05-04 19:14:16

标签: r purrr

来自:https://www.rdocumentation.org/packages/purrr/versions/0.2.2/topics/map2我们看到:

State

生成

setState

但如果需要的是:

x <- list(1, 10, 100)
y <- list(1, 2, 3)
map2(x, y, ~ .x + .y)

即:为每个2, 12, 103 添加2, 3, 4, 11, 12, 13, 101, 102, 103

的所有成员

对于循环来说似乎很简单,但是......我显然错过了purrr中显而易见的东西。

1 个答案:

答案 0 :(得分:10)

map2在这里不起作用,因为它在两个列表/向量之间并行迭代,例如Mapmapply。相反,您正在寻找cross2,它会执行两个列表的交叉连接。三个选项:

library(purrr)

x <- list(1, 10, 100)
y <- list(1, 2, 3)

cross2(y, x) %>% invoke_map_dbl(sum, .)
#> [1]   2   3   4  11  12  13 101 102 103

cross2(y, x) %>% map_dbl(~sum(unlist(.x)))
#> [1]   2   3   4  11  12  13 101 102 103

cross2(y, x) %>% simplify_all() %>% map_dbl(sum)
#> [1]   2   3   4  11  12  13 101 102 103

如果您的列表只是数字,则另一个选项是outer

outer(unlist(x), unlist(y), `+`)
#>      [,1] [,2] [,3]
#> [1,]    2    3    4
#> [2,]   11   12   13
#> [3,]  101  102  103