[英]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.