首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用contract.vertices()根据映射向量的名称命名顶点并添加频率属性

如何使用contract.vertices()根据映射向量的名称命名顶点并添加频率属性
EN

Stack Overflow用户
提问于 2013-11-24 13:38:46
回答 1查看 532关注 0票数 0

下面的图有两个类别的顶点("digit“和"char"):

代码语言:javascript
运行
复制
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)

现在我想根据“类别”属性来收缩顶点:

代码语言:javascript
运行
复制
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”是收缩顶点的“类别”,以及显示收缩顶点数量的列。

总而言之,我想:

代码语言:javascript
运行
复制
print(get.data.frame(igraph_category, what="vertices"))
#        name     frequency
# digit    digit    2
# char     char     2
EN

回答 1

Stack Overflow用户

发布于 2013-11-24 23:39:50

首先,使用因子进行收缩实际上更容易。

对于您的问题,关键是指定合并顶点时igraph应如何处理顶点属性。如果不想保留原始名称,可以直接删除它们,并指定应该保留category属性。first意味着当合并多个顶点时,igraph只接受第一个顶点的category属性。由于合并为一个顶点的所有顶点都具有相同的category,因此这很好。

然后,您可以只使用类别作为新图形中的名称。

代码语言:javascript
运行
复制
g2 <- contract.vertices(g, factor(V(g)$category),
                        vertex.attr.comb=list(category="first",
                          name="ignore"))
V(g2)$name <- V(g2)$category

在这种情况下,如果属于该类别的原始顶点之间存在多个边,则g2将包含类别之间的多个边。您可以折叠多个边,并将频率作为边属性。

最简单的方法是使用边属性weight,因为在组合边时,默认情况下会对其求和:

代码语言:javascript
运行
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20171500

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档