根据 R 中的查找 table 聚合矩阵
Aggregate a matrix based on a lookup table in R
我尝试使用存储在 R 中的另一个查找 table (.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
我有一个查询 table 告诉我哪些区域要聚合在一起,例如:
old new
z1 D1
z2 D1
z3 D1
z4 D4
z5 D4
z6 D6
z7 D7
z8 D7
这意味着我需要将 z1、z2、z3 聚合到一个组中。 z4 和 z5 到另一个组,依此类推...
基于此查找 table,我将创建一个如下所示的新矩阵:
D1 D4 D6 D7
D1 18 12 6 12
D4 3 2 1 2
D6 6 4 2 4
D7 3 2 1 2
这是通过根据查找 table:
用下面显示的块对原始矩阵中的元素求和来完成的
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 中高效地执行此操作。非常感谢。
我们可以用 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")))
我尝试使用存储在 R 中的另一个查找 table (.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
我有一个查询 table 告诉我哪些区域要聚合在一起,例如:
old new
z1 D1
z2 D1
z3 D1
z4 D4
z5 D4
z6 D6
z7 D7
z8 D7
这意味着我需要将 z1、z2、z3 聚合到一个组中。 z4 和 z5 到另一个组,依此类推...
基于此查找 table,我将创建一个如下所示的新矩阵:
D1 D4 D6 D7
D1 18 12 6 12
D4 3 2 1 2
D6 6 4 2 4
D7 3 2 1 2
这是通过根据查找 table:
用下面显示的块对原始矩阵中的元素求和来完成的 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 中高效地执行此操作。非常感谢。
我们可以用 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")))