如何在 r 中从组邻接矩阵生成单个邻接矩阵
How to generate an individual adjacency matrix from a group adjacency matrix, in r
我有一个邻接矩阵,表示物种之间的相互作用(三营养链):
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 的所有个体相关联。
我将不胜感激任何指点,我没有设法找到类似的问题,可能是因为我没有使用适当的术语。
为了说明,我们将使用末尾注释中显示的较小示例,但相同的代码可用于问题中的示例。除非另有说明,否则不使用任何包。
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
我有一个邻接矩阵,表示物种之间的相互作用(三营养链):
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 的所有个体相关联。 我将不胜感激任何指点,我没有设法找到类似的问题,可能是因为我没有使用适当的术语。
为了说明,我们将使用末尾注释中显示的较小示例,但相同的代码可用于问题中的示例。除非另有说明,否则不使用任何包。
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