用孤立的节点创建igraph

时间:2017-03-08 14:26:08

标签: r igraph

我对此问题有一个类似的问题:Reading adjacency lists with isolated nodes using igraph

我想绘制一些没有关系的节点。但由于某种原因,上述主题中提到的解决方案无法正常工作

我的数据

data <- data.frame(ID = c(143918,176206,210749,219170,247818,314764,321459,335945,339637,700689,712607,712946,735907,735907,735907,735907,735907,735907,735908,735908,735908,735908,735908,735908,735910,735911,735912,735913,746929,746929,747540,755003,767168,775558,776656,794173,794175,807493), relation = c(111098,210749,176206,NA,NA,NA,NA,NA,NA,807493,NA,NA,735908,735910,735911,735912,735913,767168,735907,735910,735911,735912,735913,767168,NA,NA,NA,NA,NA,100723,NA,NA,NA,776656,775558,NA,NA,700689))

这应该会产生一个也显示孤立节点的图:

v<-unique(data[,1])
e <- na.omit(data)

g<-graph.data.frame(e, vertices = v, directed = T)
plot(g)

出于某种原因,我得到错误:&#34;边列表中的一些顶点名称未列在顶点数据框&#34;中。

我希望有人可以告诉我我做错了什么以及如何解决这个问题。感谢

编辑: paqmo回答了我的问题,谢谢!

但是我的任务需要采用不同的方法。关系中但在第一行中缺失的ID是位于不同位置的人员。应该省略这些,同时保持第一行中每个孤立的人。我的解决方案现在使用data.table:

v <- unique(c(data[,1]))
v <- as.data.frame(v)
e <- data
setDT(v);setDT(e)
setkey(v)
setkey(e, relation)
e <- e[v]
e <- na.omit(e)
g<-graph.data.frame(e, vertices = v, directed = T)
plot(g)

欢迎任何有关更好/更有效解决方案的建议。

2 个答案:

答案 0 :(得分:4)

看起来你试图提供两次顶点名称,即一次用于e中的第一列,然后再次作为参数vertices = v

也许你真正想要的只是

g <- graph.data.frame(e, directed = T)
plot(g)

enter image description here

答案 1 :(得分:1)

您需要根据对象data两个列定义顶点列表。某些顶点位于第1列,某些顶点位于第2列。您缺少第2列中的顶点。

您可以使用%in%

进行检查
> c(e[,1], e[,2]) %in% v
 [1]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
[19]  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
[37] FALSE  TRUE  TRUE  TRUE

如您所见,e中有2个元素不在v中。因此,您会收到错误消息,说明这一点。

通过获取v中两列的唯一值,减去NAs,创建顶点列表data

data <- data.frame(ID = c(143918,176206,210749,219170,
                          247818,314764,321459,335945,
                          339637,700689,712607,712946,
                          735907,735907,735907,735907,
                          735907,735907,735908,735908,
                          735908,735908,735908,735908,
                          735910,735911,735912,735913,
                          746929,746929,747540,755003,
                          767168,775558,776656,794173,
                          794175,807493), 
                   relation = c(111098,210749,176206,
                                NA,NA,NA,NA,NA,NA,807493,
                                NA,NA,735908,735910,735911,
                                735912,735913,767168,735907,
                                735910,735911,735912,735913,
                                767168,NA,NA,NA,NA,NA,100723,
                                NA,NA,NA,776656,775558,NA,NA,700689))

v <- unique(c(data[,1], data[,2])) #Define v from both columns in data
v <- na.omit(v)
e <- na.omit(data)

g<-graph.data.frame(e, vertices = v, directed = T)
plot(g)

enter image description here