如何汇总具有不同维数的矩阵? [R]

时间:2018-07-17 14:21:27

标签: r matrix

列表中有数十万个矩阵,应按组标识符进行汇总。例如,有两个具有不同尺寸的矩阵。

a <- matrix(c(1:12),nrow=3,ncol=4,dimnames=list(c(0:2),c(0:3)))
b <- matrix(c(1:6),nrow=2,ncol=3,dimnames=list(c(0:1),c(0:2)))

> a
  0 1 2  3
0 1 4 7 10
1 2 5 8 11
2 3 6 9 12
> b
  0 1 2
0 1 3 5
1 2 4 6

您知道如何汇总这些矩阵以简单的方式获得以下矩阵吗?

c <- a + b
> c
   0  1  2  3
0  2  7 12 10
1  4  9 14 11
2  3  6  9 12

这可能不是一个难题,但是我找不到解决方案。
行和列的名称从0开始,依次递增1,但最大数量根据每个元素而有所不同。较小矩阵中无与伦比的尺寸可以用0填充。
我想我可以按组汇总它们,但是不能汇总具有不同尺寸的矩阵。

3 个答案:

答案 0 :(得分:1)

这是一个函数,它吸收两个矩阵并将它们填充为0,以使它们的尺寸相同。然后将它们相加。可以与config.py一起使用,以在一个操作中将多个数字相加。

首先,获取两个矩阵的最大行数和最大列数。然后,使用这些最大尺寸创建一个0矩阵。然后,仅填充与每个输入匹配的子矩阵。矩阵求和并返回。

getConfig

答案 1 :(得分:1)

以下是一些替代解决方案:

1)将每个转换为长格式,得到both,然后使用tapply进行汇总并转换回宽格式:

both <- rbind(as.data.frame.table(a), as.data.frame.table(b))
tapply(both[[3]], both[-3], sum, default = 0)

给予:

    Var2
Var1 0 1  2  3
   0 2 7 12 10
   1 4 9 14 11
   2 3 6  9 12

2)这将创建具有结果形状的矩阵zero,然后定义一个函数upleft,该函数将其第一个参数插入零的左上角。最后,我们将它们加在一起。

upleft <- function(x, zero) replace(zero, cbind(c(row(x)), c(col(x))), x)
zero <- array(0, pmax(dim(a), dim(b)))
upleft(a, zero) + upleft(b, zero)

给予:

     [,1] [,2] [,3] [,4]
[1,]    2    7   12   10
[2,]    4    9   14   11
[3,]    3    6    9   12

答案 2 :(得分:1)

您可以使用该函数获取任意两个矩阵,调整行和列的数量,将它们填充为0,然后将它们加起来。

sum_mat = function(a, b){
    temp = matrix(data = 0, nrow = max(nrow(a), nrow(b)), ncol = max(ncol(a), ncol(b)))
    temp_a = temp
    temp_a[1:nrow(a), 1:ncol(a)] = a
    temp_b = temp
    temp_b[1:nrow(b), 1:ncol(b)] = b
    temp_a + temp_b
}


> a
  0 1 2  3
0 1 4 7 10
1 2 5 8 11
2 3 6 9 12

> b
  0 1 2
0 1 3 5
1 2 4 6

c = sum_mat(a, b)

> c
   0  1  2  3
0  2  7 12 10
1  4  9 14 11
2  3  6  9 12