使用lapply和igraph生成二度邻居列表

时间:2016-07-29 17:32:49

标签: r igraph

我在这里得到了一些关于如何查找网络节点列表的邻居的一些很好的建议。请参阅:lapply function to look up neighbors in igraph (when not all nodes are found)

现在我需要对二度邻居做同样的事情。但是,将egoneighborhood函数替换为此循环会产生错误。

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)

get_neighbors <- function(graph, n) {

  do.call(rbind, lapply(n, function(x) {

    if (x %in% V(graph)$name) {

      nb <- neighborhood(graph,2, x)  ##HERE##

      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)
    }

  }))

}

A=get_neighbors(graph, as.character(testlist$V1))

data.frame中的错误(lookupnode = x,neighbor = nb $ name,stringsAsFactors = FALSE):参数意味着行数不同:1,0

我认为问题在于自我和邻居不能直接强制进入数据框。我可以使用unlist然后放入数据框,但我想要的值最终为row.names而不是我可以放入输出的值。

如何创建二度邻居的输出?

1 个答案:

答案 0 :(得分:2)

更改

neighbor=nb$name, # h/t @MrFlick for this shortcut

neighbor=names(unlist(nb)), # h/t @MrFlick for this shortcut

现在它正在为我工​​作。

> A
   lookupnode neighbor
1           A        A
2           A        B
3           A        C
4           H     <NA>
5           C        C
6           C        B
7           C        D
8           C        F
9           C        A
10          C        E
11          C        G
12          D        D
13          D        C
14          D        E
15          D        B
16          D        F
17          J     <NA>
>