我在这里得到了一些关于如何查找网络节点列表的邻居的一些很好的建议。请参阅:lapply function to look up neighbors in igraph (when not all nodes are found)
现在我需要对二度邻居做同样的事情。但是,将ego
或neighborhood
函数替换为此循环会产生错误。
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
而不是我可以放入输出的值。
如何创建二度邻居的输出?
答案 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>
>