2017-02-09 30 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 получить список с этой информацией, но я не сумел превратить его в dataframe в форме выше:

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>