我们可以用purrr(不同时)迭代两个列表吗?

时间:2017-09-01 15:30:35

标签: r purrr

考虑到我有一个函数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 个答案:

答案 0 :(得分:10)

您可以使用其中一个cross*功能以及map

map(cross2(x_var, y_var), unlist)

答案 1 :(得分:5)

基本R函数expand.grid函数在这里工作

expand.grid(x=x_var, y=y_var) %>% {paste(.$x, .$y)}

答案 2 :(得分:4)

您可以将来电嵌套到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 :(得分:3)

如果x_vary_var是原子向量或数组,并且函数返回已知长度的原子向量,则可以使用基本R函数outer

outer(x_var, y_var, FUN = f)

这将返回尺寸为c(dim(x_var), dim(y_var))的数组。尺寸名称类似地组合在一起。例如:

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