R 对子元素具有相同名称的列表元素求和 列表以重现最小工作示例
假设我有一张这样的清单R 对子元素具有相同名称的列表元素求和 列表以重现最小工作示例,r,arrays,list,R,Arrays,List,假设我有一张这样的清单 a <- list( list( a=matrix(c(1, 2)), b=matrix(c(1,2,1,2), ncol=2)), list( a=matrix(c(3, 5)), b=matrix(c(5,2,7,1), ncol=2)) ) [[1]] [[1]]$a [,1] [1,] 1 [2,] 2 [[1]]$b [,1] [,2]
a <- list(
list(
a=matrix(c(1, 2)),
b=matrix(c(1,2,1,2), ncol=2)),
list(
a=matrix(c(3, 5)),
b=matrix(c(5,2,7,1), ncol=2))
)
[[1]]
[[1]]$a
[,1]
[1,] 1
[2,] 2
[[1]]$b
[,1] [,2]
[1,] 1 1
[2,] 2 2
[[2]]
[[2]]$a
[,1]
[1,] 3
[2,] 5
[[2]]$b
[,1] [,2]
[1,] 5 7
[2,] 2 1
期望输出
对于a
的每个元素,我希望找到正确名称上的和。在这种情况下,我希望能够有一个类似的输出(虽然不需要是列表)
获得此输出的最快方法是什么?我可以用for循环来实现这一点,但我确信一定有更好的方法。使用
转置
来交换内部和外部列表。然后使用map
和reduce
进行总结
library(purrr)
a %>%
transpose %>%
map(~ reduce(., `+`))
# $a
# [,1]
# [1,] 4
# [2,] 7
#
# $b
# [,1] [,2]
# [1,] 6 8
# [2,] 4 3
在R垒你可以做到
Map(function(i) a[[1]][[i]] + a[[2]][[i]], el(Map(names, a)))
或者更一般地说
sapply(el(Map(names, a)), function(i) Reduce(`+`, mapply(`[`, a, i)))
# $a
# [,1]
# [1,] 4
# [2,] 7
#
# $b
# [,1] [,2]
# [1,] 6 8
# [2,] 4 3
我想名单上可能有很多elements@Euler_Salter现在好多了?
sapply(el(Map(names, a)), function(i) Reduce(`+`, mapply(`[`, a, i)))
# $a
# [,1]
# [1,] 4
# [2,] 7
#
# $b
# [,1] [,2]
# [1,] 6 8
# [2,] 4 3