从具有id的列创建邻接矩阵

时间:2014-06-20 22:50:21

标签: r

我有一个表格的data.frame ...

id   f1  f2  f3  f4 n...
01   02  03  .    .  . 
02   01  04  .   05  .
03   01  04  05  .   .
04   05  02  01  .   .
05   02  .   .   .   .
n    02  03 01   .   .

我试图将其重新编码为对称邻接矩阵,其中列和行都由成员id区分,并且单元格表示一对id之间的关系。

我在R中尝试了igraph包,但似乎函数get.adjacency只将前两列视为边列表。

任何帮助将不胜感激。

感谢。

1 个答案:

答案 0 :(得分:1)

确定。我们假设这是您的原始数据集

dd <- data.frame(
    id = c("01", "02", "03", "04", "05"), 
    f1 = c("02", "01", "01", "05", "02"),
    f2 = c("03", "04", "04", "02", NA), 
    f3 = c(NA, NA, "05", "01", NA), 
    f4 = c(NA, "05", NA, NA, NA) 
)

我们可以通过将id列中的所有值与行的其余部分中的非缺失值相结合来提取类似边缘列表的内容。我们只需使用

即可
edges <- do.call(rbind, Map(cbind, dd[,1], apply(dd[,-1], 1, na.omit)))

让我们也提取唯一的成员id和顶点总数

vertices <- unique(as.vector(ids))
N <- length(vertices)

现在我们可以用两种方式构建邻接矩阵。我们可以使用矩阵索引来制作一个

adj<-matrix(0, nrow=N, ncol=N, dimnames=list(vertices, vertices))
adj[edges]<-1

或者我们可以使用igraph库

library(igraph)
gg<-simplify(graph.edgelist(edges, directed=F))
get.adjacency(gg)

igraph应确保对称性(样本数据不对称)。它会返回

   01 02 03 04 05
01  .  1  1  1  .
02  1  .  .  1  1
03  1  .  .  1  1
04  1  1  1  .  1
05  .  1  1  1  .