【问题标题】:lapply function to look up neighbors in igraph (when not all nodes are found)lapply 函数在 igraph 中查找邻居(当没有找到所有节点时)
【发布时间】:2016-07-30 09:29:36
【问题描述】:

我正在尝试为节点列表创建网络邻居数据集。我虽然可以使用邻居命令的 lapply 函数来做到这一点。作为一个额外的复杂因素,我的一些查找节点不在图表中,但无论如何我都无法让它工作。

这是一个例子:

edgelist <- read.table(text = "
A B
B C
C D
D E
C F
F G")  

testlist <- read.table(text = "
A
H
C
D
J")  

testlist2 <- read.table(text = "
A
C
B
D
E") 

library(igraph)
graph <- graph.data.frame(edgelist)
str(graph)

neighbors<- lapply(testlist2, function(p) {  #Each pledge_id
  temp=neighbors(graph,p)  #Find all the neighbors for that pledge 
  return(temp)
})

neighbors<- lapply(testlist, function(p) {  #Each pledge_id
  temp=neighbors(graph,p)  #Find all the neighbors for that pledge 
  return(temp)
})

不幸的是,这在这两种情况下都会返回废话。我错过了什么?

我想要的输出是这样的:

lookupnode neighbor
A    B
H    .
C    D
C    F
D    E
J    .

我知道最终我需要在某个地方添加一个 temp=data.table::rbindlist(temp) 命令,但我认为这不会导致大肆宣传。

【问题讨论】:

    标签: r igraph


    【解决方案1】:

    有一件事是您正在创建一个带有read.table 函数的data.frame 并将data.frame 传递给lapply,因此它会遍历每个向量,而不是V1 向量中的元素data.frame

    其次,V1 列是一个因子(h/t 到 @Psidom 以获得因子提示)。

    第三,neighbors() 函数将返回图顶点(根据我的估计)需要迭代并返回 name 属性。

    然后,按照您的建议,这些需要 rbinded 到 data.frame

    get_neighbors <- function(graph, n) {
    
      do.call(rbind, lapply(n, function(x) {
    
        if (x %in% V(graph)$name) {
    
          nb <- neighbors(graph, x)
    
          if (length(nb) > 0) {
            data.frame(lookupnode=x,
                       neighbor=nb$name, # h/t @MrFlick for this shortcut
                       stringsAsFactors=FALSE)
          } else {
            data.frame(lookupnode=x, neighbor=NA, stringsAsFactors=FALSE)
          }
    
        } else {  
          data.frame(lookupnode=x, neighbor=NA, stringsAsFactors=FALSE)
        }
    
      }))
    
    }
    
    get_neighbors(graph, as.character(testlist$V1))
    ##   lookupnode neighbor
    ## 1          A        B
    ## 2          H     <NA>
    ## 3          C        D
    ## 4          C        F
    ## 5          D        E
    ## 6          J     <NA>
    
    get_neighbors(graph, as.character(testlist2$V1))
    ##   lookupnode neighbor
    ## 1          A        B
    ## 2          C        D
    ## 3          C        F
    ## 4          B        C
    ## 5          D        E
    ## 6          E     <NA>
    

    我想知道 Gabor 是否可以在 C 端矢量化 neighbors()

    更新:

    ego 解决方案只是有点不同:

    get_ego <- function(g, v, n=2) {
      do.call(rbind, lapply(v, function(x) {
        if (x %in% V(g)$name) {
          data.frame(node=x,
                     ego_n=sapply(ego(g, n, x), function(y) { V(g)[y]$name }),
                     stringsAsFactors=FALSE)
        } else {
          data.frame(node=x, ego_n=NA, stringsAsFactors=FALSE)
        }
      }))
    }
    

    【讨论】:

    • 你可以在data.frame中使用neighbor=nb$name而不是sapply
    • 这太棒了!当然,它是一个数据框。哎呀。 x %in% V(graph)$name 也是关键,并且在这个项目的其他地方对我有用。谢谢!
    • 这对一级邻居非常有效(这是我所要求的),但如果我在ego 函数ego(graph, 2, x) 中替换它,它会返回一个包含“igraph.vs”类的 1 列表。长度为 1,因此它仍然触发第一个 if 语句,但错误“data.frame 中的错误(lookupnode = x,neighbor = nb$name,stringsAsFactors = FALSE):参数暗示不同的行数:1, 0”暗示对我来说,这不能被强制转换为 data.frame。在这种情况下你会如何修改?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多