2017-02-15 4 views
2

Это должно быть просто, но я хочу, чтобы получить количество взаимных ребер, связанных со всеми вершинами в моем графике:Найти количество взаимных кромок вершин в igraph в R

library(igraph) 
ed <- data.frame(from = c(1,1,2,3,3), to = c(2,3,1,1,2)) 
ver <- data.frame(id = 1:3) 
gr <- graph_from_data_frame(d = ed,vertices = ver, directed = T) 
plot(gr) 

Graph

Я знаю, что могу использовать which_mutual для края, но есть эквивалент команды для получения что-то вроде этого:

# vertex edges no_mutual 
#  1  2   2 
#  2  1   1 
#  3  2   1 

UDPATE: Исправленные несоответствия в выходной таблице, как указано emilliman5

ответ

0

Вот один вкладыш решение:

> table(unlist(strsplit(attr(E(gr)[which_mutual(gr)],"vnames"),"\\|")))/2 

1 2 3 
2 1 1 

Он основан на том, имена вершин для каждого ребра в edgelist как атрибут «vnames», являющийся «|» -сепаратированной строкой. Затем он разбивается на это, тогда это дает вам таблицу всех вершин во взаимных ребрах, и каждый из них появляется дважды на каждый край, поэтому делится на два.

Если есть менее хакерский способ получить имена вершин из эглиста, я уверен, что Габор это знает.

Вот этот трюк более подробно:

Для вашего графа gr:

> E(gr) 
+ 5/5 edges (vertex names): 
[1] 1->2 1->3 2->1 3->1 3->2 

Вы можете получить вершины кромочных таким образом:

> attr(E(gr),"vnames") 
[1] "1|2" "1|3" "2|1" "3|1" "3|2" 

Так что мои один-лайнер подмножества, ребро перечислите мой критерий взаимности, затем манипулируйте строками.

0

Я не уверен, насколько это будет масштабироваться, но оно выполняет свою работу. Ваш ожидается таблица имеет некоторые несоответствия, так что я сделал все, что мог, то есть вершина 2 имеет только один происходящий край не 2.

mutual_edges <- lapply(V(gr), function(x) which_mutual(gr, es = E(gr)[from(x) | to(x)])) 
df <- data.frame(Vertex=names(mutual_edges), 
       Edges=unlist(lapply(V(gr), function(x) length(E(gr)[from(x)]))), 
       no_mutual=unlist(lapply(mutual_edges, function(x) sum(x)/2))) 
df 

# Vertex Edges no_mutual 
#1  1  2   2 
#2  2  1   1 
#3  3  2   1 
Смежные вопросы