2013-11-24 1 views
0

Пожалуйста, обратите внимание на следующий граф с вершинами из двух категорий («цифра» и «полукокс»):Как назвать вершины с contract.vertices() в соответствии с именами отображения вектора и добавить атрибут частоты

library(igraph) 
id <- c("1","2","A","B") 
category <- c("digit","digit","char","char") 
from <- c("1","1","2","A","A","B") 
to <- c("2","A","A","B","1","2") 

nodes <- cbind(id,category) 
edges <- cbind(from,to) 

g <- graph.data.frame(edges, directed=TRUE, vertices=nodes) 

Теперь я хочу, чтобы стянуть вершины на основе атрибута «категории»:

category_attr <- get.vertex.attribute(g, "category") 
map = setNames(c(1:2), c("digit","char")) 
category_attr <- map[unlist(category_attr)] 
igraph_category <- contract.vertices(g, category_attr) 
print(get.data.frame(igraph_category, what="vertices")) 
#    name 
# c("1", "2") 1, 2 
# c("A", "B") A, B 

Но я хотел бы «ID» и атрибут «имя» нового графика, чтобы быть «категория» законтрактованных вершин, а также столбец, где показано количество сокращенных вершин.

В общем, я хотел бы:

print(get.data.frame(igraph_category, what="vertices")) 
#  name  frequency 
# digit digit 2 
# char  char  2 
+0

Поперечное размещена здесь: http://lists.gnu.org/archive/html/ igraph-помощь/2013-11/msg00175.html –

ответ

0

Прежде всего, это на самом деле проще использовать факторы, чтобы сделать сокращение.

Для вашей проблемы ключ должен указывать, что должен делать igraph с атрибутами вершин при слиянии вершин. Если вы не хотите, чтобы исходные имена сохранялись, вы можете просто удалить их и указать, что атрибут category должен храниться. first означает, что igraph просто принимает атрибут category первой вершины при слиянии нескольких вершин. Поскольку все вершины, объединенные в один, имеют одинаковые category, это хорошо.

Тогда вы можете просто использовать категории в качестве имен в новом графике.

g2 <- contract.vertices(g, factor(V(g)$category), 
         vertex.attr.comb=list(category="first", 
          name="ignore")) 
V(g2)$name <- V(g2)$category 

g2 будет мульти-граф (или не-простого графа в другой терминологии), в этом случае она будет содержать несколько ребер между категориями, если бы было больше, чем одно ребро между исходными вершинами, принадлежащих к тому, что категории. Вы можете свернуть кратные края и получить в качестве атрибута края значение .

Проще всего использовать край атрибута weight, потому что это суммируется по умолчанию при сочетающие края:

E(g2)$weight <- 1 
g3 <- simplify(g2, remove.loops=FALSE) 

str(g3, e=T) 

# IGRAPH DNW- 2 4 -- 
# + attr: category (v/c), name (v/c), weight (e/n) 
# + edges (vertex names) and their attributes: 
#    edge weight 
# [1] char ->char  1 
# [2] char ->digit  2 
# [3] digit->char  2 
# [4] digit->digit  1