繁体   English   中英

如何将 function 应用于多个列表并在 R 中获得一个列表作为 output?

[英]How applying a function to multiple lists and get a list as the output in R?

我有两个列表AB ,每个列表都有 100 个元素。 每个元素都是一个方阵, N in N 我想将列表A中的元素i与列表B中的元素i (I 在 1 到 100 之间)相乘,并得到一个包含 100 个元素的列表,如 output。

我如何使用应用函数来做到这一点? 例如, lapplysapplymapply ,...

正如 RonakShah 在评论中所说, Map可能是这里的答案。

可以这样想: lapply将 function 应用于一个列表的每个元素:

myfunc <- function(x) {
  # do something with x
}
lapply(1:4, myfunc)
## unrolls to be the equivalent of ...
list(
  myfunc(1),
  myfunc(2),
  myfunc(3),
  myfunc(4)
)

然而, Map将多个列表的每个第n个元素“压缩”在一起。 上面lapply使用Map的等价物是

Map(myfunc, 1:4)

但还有更多。

myfunc_many <- function(x, y, z) {
  # do something with all three args
}
Map(myfunc_many, 1:4, 11:14, 21:24)
## unrolls to 
list(
  myfunc_many(1, 11, 21),
  myfunc_many(2, 12, 22),
  myfunc_many(3, 13, 23),
  myfunc_many(4, 14, 24)
)

Map可以处理任意数量的列表; 如果你的 function 是可变的(接受任意数量的参数),它仍然可以工作(尽管你的 function 必须有处理它的内置机制,使其可变):

myfunc_variadic <- function(...) {
  dots <- list(...)
  # do something with dots
}
Map(myfunc_variadic, 1:4)
Map(myfunc_variadic, 1:4, 11:14)
Map(myfunc_variadic, 1:4, 11:14, 21:24, 31:34, 41:44)

在上面的所有示例中,我都使用向量作为每个参数,但它同样适用于事物列表。 最后一个例子,

set.seed(42)
L1 <- replicate(2, matrix(sample(6), nrow = 2), simplify = FALSE)
L2 <- replicate(2, matrix(sample(6), nrow = 2), simplify = FALSE)
L1
# [[1]]
#      [,1] [,2] [,3]
# [1,]    1    6    2
# [2,]    5    4    3
# [[2]]
#      [,1] [,2] [,3]
# [1,]    2    1    5
# [2,]    6    3    4
L2
# [[1]]
#      [,1] [,2] [,3]
# [1,]    4    5    3
# [2,]    1    2    6
# [[2]]
#      [,1] [,2] [,3]
# [1,]    2    1    5
# [2,]    3    4    6
Map(`*`, L1, L2)
# [[1]]
#      [,1] [,2] [,3]
# [1,]    4   30    6
# [2,]    5    8   18
# [[2]]
#      [,1] [,2] [,3]
# [1,]    4    1   25
# [2,]   18   12   24

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM