我正在尝试为节点列表创建网络邻居的数据集。我虽然可以使用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。
答案 0 :(得分:5)
有一件事是,您正在使用data.frame
函数创建read.table
并将data.frame
传递给lapply
,以便它迭代过来每个向量,而不是V1
中data.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)
}
}))
}