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我添加了另一个答案,以便您可以检查您更喜欢哪一个。