下面的图有两个类别的顶点("digit“和"char"):
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“和属性"name”是收缩顶点的“类别”,以及显示收缩顶点数量的列。
总而言之,我想:
print(get.data.frame(igraph_category, what="vertices"))
# name frequency
# digit digit 2
# char char 2发布于 2013-11-24 23:39:50
首先,使用因子进行收缩实际上更容易。
对于您的问题,关键是指定合并顶点时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 1https://stackoverflow.com/questions/20171500
复制相似问题