如何在R中有效地总结列表中的矩阵(无循环)?

时间:2016-09-15 13:48:54

标签: r matrix vectorization

假设我有一个函数返回2个矩阵。对于每个输入i。

f<-function(i){
  m1=matrix(i,ncol=5,nrow=5)
  m2=matrix(i*10,ncol=5,nrow=5)
  r=list(m1=m1,m2=m2)
  return(r)
}
d=lapply(1:3,f)

如何在没有for循环的情况下获得2件事情?

d[[1]]$m1+d[[2]]$m1+d[[3]]$m1
d[[1]]$m2+d[[2]]$m2+d[[3]]$m2

我为m1尝试了sum(lapply(1:3,function(x) (d[[x]]$m1))),但无效。

2 个答案:

答案 0 :(得分:4)

您可以使用Reduce

Reduce("+", lapply(d, function(x) x$m1))

您还可以使用purrr包中的m1m2transpose获取mapreduce

library(purrr)
map(transpose(d), reduce, `+`)

返回:

$m1
     [,1] [,2] [,3] [,4] [,5]
[1,]    6    6    6    6    6
[2,]    6    6    6    6    6
[3,]    6    6    6    6    6
[4,]    6    6    6    6    6
[5,]    6    6    6    6    6

$m2
     [,1] [,2] [,3] [,4] [,5]
[1,]   60   60   60   60   60
[2,]   60   60   60   60   60
[3,]   60   60   60   60   60
[4,]   60   60   60   60   60
[5,]   60   60   60   60   60

答案 1 :(得分:2)

我们遍历内部嵌套list元素(lapply(paste0("m", 1:2), ..)的名称,循环遍历list元素(lapply(d, ...),提取与之匹配的元素names d1[[nm]])并Reduce使用+(发布时我没有看到其他答案)。

lapply(paste0("m", 1:2), function(nm) lapply(d, function(d1) Reduce(`+`, d1[[nm]])))
#[[1]]
#     [,1] [,2] [,3] [,4] [,5]
#[1,]    6    6    6    6    6
#[2,]    6    6    6    6    6
#[3,]    6    6    6    6    6
#[4,]    6    6    6    6    6
#[5,]    6    6    6    6    6

#[[2]]
#     [,1] [,2] [,3] [,4] [,5]
#[1,]   60   60   60   60   60
#[2,]   60   60   60   60   60
#[3,]   60   60   60   60   60
#[4,]   60   60   60   60   60
#[5,]   60   60   60   60   60