如何将igraph ego()列表转换为有意义的数据帧?

时间:2017-02-09 13:26:57

标签: r igraph

我有以下网络:

edges <- data.frame(from=c('a','1','2','b'), to=c('1','2','3','4'))
edges
   from to
1    a  1
2    1  2
3    2  3
4    b  4

并希望通过以下方式识别“to”节点的邻域:

1 a NA NA
2 1 a  NA
3 2 1  a
4 b NA NA

理想情况下,我只会得到

3 2 1  a
4 b NA NA

因为我只想获得从'a'到'3'和'4'到'b'的完整路径。

使用igraph包中的ego()函数,我得到一个包含此信息的列表,但我还没有设法将其转换为上述表格中的数据框:

test <- ego(graph,4,edges[,2], "in")
test
[[1]]
+ 1/6 vertex, named:
[1] a

[[2]]
+ 2/6 vertices, named:
[1] 1 a

[[3]]
+ 3/6 vertices, named:
[1] 2 1 a

[[4]]
+ 1/6 vertex, named:
[1] b 

以下是我未成功的试验:

require(plyr)
> data.frame(ldply(test, rbind))
   a X1 X2  b
1  1 NA NA NA
2  1  2 NA NA
3  1  2  3 NA
4 NA NA NA  4

data.frame(t(unlist(test)))
a X1 a.1 X2 X1.1 a.2 b
1 1  2   1  3    2   1 4

2 个答案:

答案 0 :(得分:1)

我们也可以使用rbind.fill

library(plyr)
rbind.fill(lapply(test, function(x)as.data.frame(t(names(x)))))
#  V1   V2   V3
#1  a <NA> <NA>
#2  1    a <NA>
#3  2    1    a
#4  b <NA> <NA>

答案 1 :(得分:0)

好的,我找到了一种方法,但我不确定它是否效率最高。

neighbors <- lapply(1:length(test), function(x) names(test[[x]]))
require(plyr)
data.frame(edges$to,ldply(neighbors, rbind))
  edges.to X1   X2   X3
1        1  a <NA> <NA>
2        2  1    a <NA>
3        3  2    1    a
4        4  b <NA> <NA>