【问题标题】:How applying a function to multiple lists and get a list as the output in R?如何将一个函数应用于多个列表并获得一个列表作为 R 中的输出?
【发布时间】:2021-10-24 16:32:02
【问题描述】:

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

如何使用应用功能做到这一点?例如,lapplysapplymapply、...

【问题讨论】:

  • 你试过Map(`*`, A, B)吗?
  • 你不需要只使用函数as.list(A*B),但你为什么要将结果作为列表?

标签: r list lapply sapply mapply


【解决方案1】:

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

这样想:lapply 将一个函数应用于一个列表的每个元素:

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,然而,将多个列表的每个nth 元素“压缩”在一起。以上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 可以处理任意数量的列表;如果你的函数是variadic(接受任意数量的参数),它仍然可以工作(尽管你的函数必须有内置的机制来处理它,使其可变):

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-09
    • 2020-07-24
    • 2021-06-02
    • 2020-10-08
    • 2020-07-19
    • 2020-06-07
    相关资源
    最近更新 更多