基于R中的查找表汇总矩阵

问题描述 投票:0回答:1

[我试图使用存储在R中另一个查找表(.csv)中的信息来汇总大矩阵(.csv)。

An example of the large matrix:
   z1 z2 z3 z4 z5 z6 z7 z8
z1  1  1  1  1  1  1  1  1
z2  2  2  2  2  2  2  2  2
z3  3  3  3  3  3  3  3  3
z4  0  0  0  0  0  0  0  0
z5  1  1  1  1  1  1  1  1
z6  2  2  2  2  2  2  2  2
z7  1  1  1  1  1  1  1  1
z8  0  0  0  0  0  0  0  0

我有一个查找表,告诉我哪些区域要聚合在一起,例如:

old  new
z1   D1
z2   D1
z3   D1
z4   D4
z5   D4
z6   D6
z7   D7
z8   D7

这意味着我需要将z1,z2,z3聚合为一个组。 z4和z5分成另一个组,依此类推...

基于此查找表,我将创建一个新的矩阵,如下所示:

    D1  D4  D6  D7
D1  18  12   6  12
D4   3   2   1   2
D6   6   4   2   4
D7   3   2   1   2

这是通过根据查询表按以下所示的块对原始矩阵中的元素求和来完成的:

     z1 z2 z3   z4 z5   z6   z7 z8

z1   1  1  1    1  1    1    1  1
z2   2  2  2    2  2    2    2  2
z3   3  3  3    3  3    3    3  3

z4   0  0  0    0  0    0    0  0
z5   1  1  1    1  1    1    1  1

z6   2  2  2    2  2    2    2  2

z7   1  1  1    1  1    1    1  1
z8   0  0  0    0  0    0    0  0

我很想知道如何在R中有效地做到这一点。非常感谢。

r matrix aggregation lookup-tables
1个回答
0
投票

我们可以用outer来做到这一点

un1 <- unique(df1$new)    
out <- outer(un1, un1, FUN = Vectorize(function(x, y)  
         sum(m1[df1$old[df1$new == x], df1$old[df1$new == y]])))
dimnames(out) <- list(un1, un1)
out
#   D1 D4 D6 D7
#D1 18 12  6 12
#D4  3  2  1  2
#D6  6  4  2  4
#D7  3  2  1  2

数据

df1 <- structure(list(old = c("z1", "z2", "z3", "z4", "z5", "z6", "z7", 
"z8"), new = c("D1", "D1", "D1", "D4", "D4", "D6", "D7", "D7"
)), class = "data.frame", row.names = c(NA, -8L))

m1 <- structure(c(1L, 2L, 3L, 0L, 1L, 2L, 1L, 0L, 1L, 2L, 3L, 0L, 1L, 
2L, 1L, 0L, 1L, 2L, 3L, 0L, 1L, 2L, 1L, 0L, 1L, 2L, 3L, 0L, 1L, 
2L, 1L, 0L, 1L, 2L, 3L, 0L, 1L, 2L, 1L, 0L, 1L, 2L, 3L, 0L, 1L, 
2L, 1L, 0L, 1L, 2L, 3L, 0L, 1L, 2L, 1L, 0L, 1L, 2L, 3L, 0L, 1L, 
2L, 1L, 0L), .Dim = c(8L, 8L), .Dimnames = list(c("z1", "z2", 
"z3", "z4", "z5", "z6", "z7", "z8"), c("z1", "z2", "z3", "z4", 
"z5", "z6", "z7", "z8")))
© www.soinside.com 2019 - 2024. All rights reserved.