R-具有不同列的矩阵总和列表

时间:2019-03-21 12:02:39

标签: r matrix sum

我有很多列不同的矩阵,如果一个列中不存在X列,我想将这些矩阵加起来为0。

如果您使用了plyr中的函数rbind.fill,那么我会想要类似的东西,但要有sum函数。当然,我可以构建一个函数来执行此操作,但是由于存在大量数据,我正在考虑使用Frotrain或C有效编程的本机函数。

这里是一个例子: 这是我拥有相同列的简单示例:

aa <- list(
  m1 = matrix(c(1,2,3,4,5,6,7,8,9), nrow = 3, dimnames = list(c(1,2,3),c('a','b','c'))),
  m2 = matrix(c(1,2,3,4,5,6,7,8,9), nrow = 3, dimnames = list(c(1,2,3),c('a','b','c')))
)
aa
Reduce('+',aa)

给出结果:

> aa
$m1
  a b c
1 1 4 7
2 2 5 8
3 3 6 9

$m2
  a b c
1 1 4 7
2 2 5 8
3 3 6 9

> Reduce('+',aa)
  a  b  c
1 2  8 14
2 4 10 16
3 6 12 18

以及我的数据:

bb <- list(
  m1 = matrix(c(1,2,3,7,8,9), nrow = 3, dimnames = list(c(1,2,3),c('a','c'))),
  m2 = matrix(c(1,2,3,4,5,6,7,8,9), nrow = 3, dimnames = list(c(1,2,3),c('a','b','c')))
)
bb
Reduce('+',bb)

在这里,我想在第一个矩阵中将b = c(0,0,0)求和。

> bb
$m1
  a c
1 1 7
2 2 8
3 3 9

$m2
  a b c
1 1 4 7
2 2 5 8
3 3 6 9

非常感谢!

Xevi

1 个答案:

答案 0 :(得分:1)

一个选项是

un1 <- sort(unique(unlist(lapply(bb, colnames))))
bb1 <- lapply(bb, function(x) {
    nm1 <- setdiff(un1, colnames(x))
    m1 <- matrix(0, nrow = nrow(x), ncol = length(nm1), dimnames = list(NULL, nm1))
    cbind(x, m1)[, un1]})

并使用Reduce

Reduce(`+`, bb1)
#   a b  c
# 1 2 4 14
# 2 4 5 16
# 3 6 6 18