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

Generate list of second-degree neighbors using lapply and igraph

我在这里得到了一些关于如何为网络节点列表查找邻居的极好的建议。参见:

现在我需要对二级邻居做同样的事情。但是,将 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 而不是我可以放入输出中的值。

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

已更改

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