lapply函数在igraph中查找邻居(当找不到所有节点时)

时间:2016-07-28 19:59:36

标签: r igraph

我正在尝试为节点列表创建网络邻居的数据集。我虽然可以使用lapply函数来执行此操作,其中我使用neighbors命令。作为一个额外的复杂功能,我的一些查找节点不在图中,但无论如何我无法使其工作。

以下是一个例子:

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

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

我想要的输出是这样的:

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

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

1 个答案:

答案 0 :(得分:5)

有一件事是,您正在使用data.frame函数创建read.table并将data.frame传递给lapply,以便它迭代过来每个向量,而不是V1data.frame向量的元素。

其次,V1列是一个因素(因子提示的h / t为@Psidom)。

第三,neighbors()函数将返回图形顶点(从我的计算中)需要迭代并返回name属性。

然后,按照您的建议,这些需要rbind加入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)
    }
  }))
}