[英]How applying a function to multiple lists and get a list as the output in R?
我有两个列表A和B ,每个列表都有 100 个元素。 每个元素都是一个方阵, N in N 。 我想将列表A中的元素i与列表B中的元素i (I 在 1 到 100 之间)相乘,并得到一个包含 100 个元素的列表,如 output。
我如何使用应用函数来做到这一点? 例如, lapply , sapply , mapply ,...
正如 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.