【问题标题】:How to generate an individual adjacency matrix from a group adjacency matrix, in r如何在 r 中从组邻接矩阵生成单个邻接矩阵
【发布时间】:2022-01-17 08:24:30
【问题描述】:

我有一个通过物种相互作用(三营养链)表示物种的邻接矩阵:

mat = matrix(c(0,1,0,
               0,0,1,
               0,0,0), nrow=3, byrow = T,
             dimnames = list(c("sp1","sp2","sp3"),
                             c("sp1","sp2","sp3")))

以及包含物种丰度的数据框:

comm = t(data.frame(sp1=100,
                    sp2=20,
                    sp3=5))

使用上述方法,有没有一种有效的方法来创建基于个体的邻接矩阵?

in.mat = matrix(0, nrow = sum(comm),
               ncol = sum(comm),
            byrow = T,
            dimnames = list(c(rep("sp1",100),rep("sp2",20),rep("sp3",5)),
                            c(rep("sp1",100),rep("sp2",20),rep("sp3",5))))

所以 sp3 的所有个体都与 sp2 的所有个体以及 sp1 的所有个体相关联。 我会很感激任何指示,我没有设法找到类似的问题,也许是因为我没有使用适当的术语。

【问题讨论】:

  • 我不太确定您要做什么,您能否详细说明in.mat 的所需形状?你为什么使用sum(comm)nrow(comm), ncol(comm) 不是你想要的吗?
  • 所需的输出是所有 125 个人根据他们所属的组 (sp1,sp2,sp3) 进行交互的方阵。
  • 请注意,comm 是一个矩阵,而不是一个数据框。

标签: r igraph adjacency-matrix


【解决方案1】:

为了说明,我们将在最后的注释中使用一个较小的示例,但相同的代码将适用于问题中的示例。除非另有说明,否则不使用任何包。

1) 将名称展开为 nms,然后使用下标。

nms <- rep(rownames(comm), comm)
mat[nms, nms]
##       [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
##  [1,]    0    0    1    1    1    0    0    0    0
##  [2,]    0    0    1    1    1    0    0    0    0
##  [3,]    0    0    0    0    0    1    1    1    1
##  [4,]    0    0    0    0    0    1    1    1    1
##  [5,]    0    0    0    0    0    1    1    1    1
##  [6,]    0    0    0    0    0    0    0    0    0
##  [7,]    0    0    0    0    0    0    0    0    0
##  [8,]    0    0    0    0    0    0    0    0    0
##  [9,]    0    0    0    0    0    0    0    0    0

2) 使用上述 nms 的另一种方法是使用以下方法之一:

outer(nms, nms, function(x, y) mat[cbind(x, y)])

outer(nms, nms, Vectorize(function(x, y) mat[x, y]))

sapply(nms, function(y) sapply(nms, function(x) mat[x, y]))

library(listcompr)
gen.matrix(mat[x, y], x = nms, y = nms)

也可以使用 eList 或 comprehenr 包。

注意

# input
sp <- paste0("sp", 1:3)
mat <- matrix(c(0,0,0,1,0,0,0,1,0), 3, dimnames = list(sp, sp))
comm <- matrix(2:4, 3, dimnames = list(sp, NULL))

mat
##     sp1 sp2 sp3
## sp1   0   1   0
## sp2   0   0   1
## sp3   0   0   0

comm
##     [,1]
## sp1    2
## sp2    3
## sp3    4

【讨论】:

  • 哇,这不仅解决了我的问题,还向我展示了我的 reprex 应该是什么样子......非常感谢