【问题标题】:creating igraph with isolated nodes创建具有孤立节点的 igraph
【发布时间】:2017-07-29 04:12:28
【问题描述】:

我有一个类似的问题: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)

由于某种原因,我收到错误消息:“边缘列表中的某些顶点名称未在顶点数据框中列出”。

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

编辑: 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)

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

【问题讨论】:

    标签: r igraph


    【解决方案1】:

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

    也许你真正想要的只是

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

    【讨论】:

      【解决方案2】:

      您需要根据对象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 中。因此,您会收到一条错误消息。

      通过取data 中两列的唯一值(减去 NA)来创建顶点列表 v

      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)
      

      【讨论】:

      • 我尽量避免就此提出另一个问题,所以:如何将您的以下代码应用于 2 个 data.frames(边缘列表和节点列表分别存储为数据,应与 graph.data.frame 结合使用): v &lt;- unique(c(data[,1], data[,2])) #Define v from both columns in data v &lt;- na.omit(v) e &lt;- na.omit(data) ?
      猜你喜欢
      • 1970-01-01
      • 2014-07-21
      • 2020-11-02
      • 2017-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-17
      相关资源
      最近更新 更多