首页 > 解决方案 > 对部分重叠的方阵/数组求和

问题描述

我有两个这样的方阵/数组

## 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

我需要总结它们(每个现有的列/行对)并保留所有可能的组合,例如:

  A B C D
A 3 1 1 0
B 1 2 0 1
C 1 0 1 0
D 0 1 0 1

我必须多次计算这个过程,所以我正在寻找一种快速且轻量级的解决方案。

任何帮助都会很糟糕,我被卡住了;)

标签: rarraysmatrixsum

解决方案


使用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))
      )
    )
  )
)

  A B C D
A 3 1 1 0
B 1 2 0 1
C 1 0 1 0
D 0 1 0 1

另一种选择使用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

推荐阅读