簡體   English   中英

如何匯總具有不同維數的矩陣? [R]

[英]How to aggregate matrices which have different dimensions? [R]

我的列表中有數十萬個矩陣,應按組標識符進行匯總。 例如,存在兩個具有不同尺寸的矩陣。

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填充。
我想我可以按組匯總它們,但不能匯總具有不同尺寸的矩陣。

這是一個函數,它接受兩個矩陣並將其填充為0,以使它們的尺寸相同。 然后將它們相加。 可以將其與Reduce一起使用,以Reduce一個操作中的多個對象加在一起。

首先,獲得兩個矩陣的最大行數和最大列數。 然后,使用這些最大尺寸創建一個0矩陣。 然后,僅填充與每個輸入匹配的子矩陣。 矩陣相加並返回。

sum_ragged_matrix = function(m1,m2){
  m1r = nrow(m1r)
  m2r = nrow(m2r)

  m1c = ncol(m1c)
  n2c = ncol(m2c)

  max_rows = max(c(m1r,m2r))
  max_cols = max(c(m1c,m2c))
  t1 = matrix(0,nrow = max_rows,ncol = max_cols)
  t2 = t1
  t1[1:m1r,1:m1c] = m1
  t2[1:m2r,1:m2c] = m2
  return(t1+t2)
}

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)))
c = matrix(c(1:4),nrow=2,ncol=2,dimnames=list(c(0:1),c(0:1)))

Reduce(sum_ragged_matrix,list(a=a,b=b,c=c),init=matrix(0,nrow=1,ncol=1))

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

1)將每個both轉換為長格式,並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

您可以使用該函數獲取任意兩個矩陣,調整行和列的數量,將它們填充為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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM