我有一个物种互动网络物种,第一行有捕食者身份,第一列有猎物身份。基质是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
非常感谢
瓦莱丽
答案 0 :(得分:0)
您可以使用as.table
和data.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]