R 部分重叠平方和矩阵/数组
我有两个这样的方阵R 部分重叠平方和矩阵/数组,r,arrays,matrix,sum,R,Arrays,Matrix,Sum,我有两个这样的方阵 ## Matrix 1 t1 <- c(2,1,1,1,1,0,1,0,1) column.names <- c("A","B","C") row.names <- c("A","B","C") m1 <- array(t1,dim = c(3,3),dimnames = list(row.names,column.names)) m
## Matrix 1
t1 <- c(2,1,1,1,1,0,1,0,1)
column.names <- c("A","B","C")
row.names <- c("A","B","C")
m1 <- array(t1,dim = c(3,3),dimnames = list(row.names,column.names))
m1
A B C
A 2 1 1
B 1 1 0
C 1 0 1
## Matrix 2
t2 <- c(1,0,0,0,1,1,0,1,1)
column.names <- c("A","B","D")
row.names <- c("A","B","D")
m2 <- array(t2,dim = c(3,3),dimnames = list(row.names,column.names))
m2
A B D
A 1 0 0
B 0 1 1
D 0 1 1
我必须多次计算这个过程,所以我正在寻找一个快速、轻量级的解决方案
任何帮助都会很糟糕,我被卡住了;) 通过包含两个行名和列名中可用的所有行名和列名,使
m1
和m2
具有相同的维度。将不存在的值替换为0。然后,您可以将这两个元素添加到一起
cols <- unique(c(colnames(m1), colnames(m2)))
rows <- unique(c(rownames(m1), rownames(m2)))
dummy_m1 <- matrix(0, nrow = length(cols), ncol = length(rows),
dimnames = list(cols, rows))
dummy_m2 <- dummy_m1
dummy_m1[rownames(m1), colnames(m1)] <- m1
dummy_m2[rownames(m2), colnames(m2)] <- m2
dummy_m1 + dummy_m2
# A B C D
#A 3 1 1 0
#B 1 2 0 1
#C 1 0 1 0
#D 0 1 0 1
cols通过包含两个行名和列名,使m1
和m2
具有相同的维度。将不存在的值替换为0。然后,您可以将这两个元素添加到一起
cols <- unique(c(colnames(m1), colnames(m2)))
rows <- unique(c(rownames(m1), rownames(m2)))
dummy_m1 <- matrix(0, nrow = length(cols), ncol = length(rows),
dimnames = list(cols, rows))
dummy_m2 <- dummy_m1
dummy_m1[rownames(m1), colnames(m1)] <- m1
dummy_m2[rownames(m2), colnames(m2)] <- m2
dummy_m1 + dummy_m2
# A B C D
#A 3 1 1 0
#B 1 2 0 1
#C 1 0 1 0
#D 0 1 0 1
cols使用xtabs的基本R选项
+expand.grid
as.data.frame.matrix(
xtabs(
p ~ .,
do.call(
rbind,
lapply(
list(m1, m2),
function(x) cbind(expand.grid(dimnames(x)), p = c(x))
)
)
)
)
给予
另一个使用igraph的选项
library(igraph)
get.adjacency(
graph_from_data_frame(
do.call(
rbind,
lapply(
list(m1, m2),
function(x) {
get.data.frame(
graph_from_adjacency_matrix(
x,
"undirected"
)
)
}
)
), FALSE
),
sparse = FALSE
)
给
A B C D
A 3 1 1 0
B 1 2 0 1
C 1 0 1 0
D 0 1 0 1
使用xtabs
+expand.grid
as.data.frame.matrix(
xtabs(
p ~ .,
do.call(
rbind,
lapply(
list(m1, m2),
function(x) cbind(expand.grid(dimnames(x)), p = c(x))
)
)
)
)
给予
另一个使用igraph的选项
library(igraph)
get.adjacency(
graph_from_data_frame(
do.call(
rbind,
lapply(
list(m1, m2),
function(x) {
get.data.frame(
graph_from_adjacency_matrix(
x,
"undirected"
)
)
}
)
), FALSE
),
sparse = FALSE
)
给
A B C D
A 3 1 1 0
B 1 2 0 1
C 1 0 1 0
D 0 1 0 1
我们讨论了多少次?大约1000个?有1000个矩阵可能有不同的行名和列名吗?是的,在1000个矩阵中,有些可能有相同的行名和列名,有些可能有部分重叠,其他可能完全不同我们在谈论多少次?大约1000个矩阵你有1000个矩阵可能有不同的行名和列名吗?是的,在1000个矩阵中,一些可能有相同的行名和列名,一些可能有部分重叠,另一些可能有完全不同的列名和列名!那太好了!伟大的那太好了!很好,它的工作原理和前面的答案一样好,但是更容易迭代!谢谢@RPO我添加了另一个答案,以便您可以检查您更喜欢哪一个。太好了,它的工作原理与前面的答案相同,但更易于迭代!谢谢@RPO我添加了另一个答案,以便您可以检查您更喜欢哪一个。