我们能否使用purrr迭代两个列表 (非同时迭代)?

12
考虑我有一个函数f(x,y),它接受两个参数和两个列表:

  • x_var = list('x','y','z')
  • 以及y_var = list('a','b')

是否有purrr函数可以让我迭代x_var中一个元素和y_var中一个元素的每个组合?也就是说,做f(x,a)f(x,b)f(y,a)f(y,b)等。

通常的解决方案是编写一个循环,但我想知道这里是否更简洁(可能使用purrr)。

谢谢!

4个回答

13

您可以使用cross*函数之一以及map

map(cross2(x_var, y_var), unlist)

5
基础的R函数expand.grid可用于此处。
expand.grid(x=x_var, y=y_var) %>% {paste(.$x, .$y)}

5
您可以嵌套调用 map 函数。
library(purrr)
map(x_var, function(x) {
  map(y_var, paste, x)
})
[[1]]

[[1]][[1]]
[1] "a x"

[[1]][[2]]
[1] "b x"


[[2]]
[[2]][[1]]
[1] "a y"

[[2]][[2]]
[1] "b y"


[[3]]
[[3]][[1]]
[1] "a z"

[[3]][[2]]
[1] "b z"

3
如果x_vary_var是原子向量或数组,并且该函数返回已知长度的原子向量,则可以使用基本的R函数outer进行操作。
outer(x_var, y_var, FUN = f)

这将返回一个具有维度的数组。维度名称也以类似方式组合。例如:
x_var <- setNames(1:3, c("a", "b", "c"))
y_var <- setNames(4:5, c("d", "e"))
outer(x_var, y_var, '+')
#   d e
# a 5 6
# b 6 7
# c 7 8

不错!我想知道在tidyverse中是否有相应的等价物?我喜欢它的输出矩阵。 - ℕʘʘḆḽḘ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接