如何通过物种相互作用矩阵将物种转换为数据帧?

时间:2014-08-06 09:29:11

标签: r networking interaction bipartite

我有一个物种互动网络物种,第一行有捕食者身份,第一列有猎物身份。基质是0或1的填料,表示存在或不存在相互作用。我想将此矩阵转换为具有两列的数据帧,第一列包含捕食者的身份,第二列包含猎物的身份。因此,每一行将由不同的捕食者 - 猎物组合定义,代表独特的相互作用。 这是它应该是什么样子:

int.matrix <- matrix(c(1,1,0,1,0,1,0,0,1,0,0,1,0,1,0,0),nrow=4,ncol=4)
rownames(int.matrix)<-c("prey1","prey2","prey3","prey4")
colnames(int.matrix)<-c("pred1","pred2","pred3","pred4")
int.matrix

        pred1 pred2 pred3 pred4
prey1     1     0     1     0
prey2     1     1     0     1
prey3     0     0     0     0
prey4     1     0     1     0

L1 <- c("pred1","pred1","pred1","pred2","pred3","pred3","pred4")
L2 <- c("prey1","prey2","prey4","prey2","prey1","prey4","prey2")
data.frame(cbind(L1,L2))

     L1    L2
1 pred1 prey1
2 pred1 prey2
3 pred1 prey4
4 pred2 prey2
5 pred3 prey1
6 pred3 prey4
7 pred4 prey2

非常感谢

瓦莱丽

2 个答案:

答案 0 :(得分:0)

您可以使用as.tabledata.frame,如下所示:

> x <- data.frame(as.table(int.matrix))
> x[x$Freq == 1, 1:2]
    Var1  Var2
1  prey1 pred1
2  prey2 pred1
4  prey4 pred1
6  prey2 pred2
9  prey1 pred3
12 prey4 pred3
14 prey2 pred4

data.frame上使用table时,您会获得“长”data.frame。由于此data.frame也包含“0”值,因此您只选择Freq列等于1的行。

答案 1 :(得分:0)

您也可以尝试:

indx <- !!int.matrix
data.frame(Var1=rownames(indx)[row(indx)][indx], Var2=colnames(indx)[col(indx)][indx])
#   Var1  Var2
#1 prey1 pred1
#2 prey2 pred1
#3 prey4 pred1
#4 prey2 pred2
#5 prey1 pred3
#6 prey4 pred3
#7 prey2 pred4

或者

indx <- (1:4)*int.matrix 
data.frame(Var1=row.names(int.matrix)[indx], Var2=colnames(int.matrix)[indx])

或者

library(reshape2)
res <- melt(!!int.matrix)
res[res$value,-3]