2017-02-09 38 views
1

我有以下网络:如何将igraph ego()列表转换为有意义的数据框?

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 

,并希望标识的下列方式 “到” 节点附近:

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包中的自我()函数,我得到这个信息的列表,但我还没有成功地将其转换成数据帧的形式上面:

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 

回答

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