跳到内容

很多时候,当图形的结构被修改时,原始图形的顶点/边的映射会映射到新创建(修改)的图形中的顶点/边。例如,simplify() 将多条边映射到单条边。 igraph 提供了一种灵活的机制来指定在这些情况下如何处理顶点/边属性。

详细信息

支持属性组合的函数具有一个或两个额外的参数,称为 vertex.attr.comb 和/或 edge.attr.comb,用于指定如何执行属性的映射。例如,contract() 将多个顶点收缩为一个顶点,顶点的属性可以组合并存储为新图形的顶点属性。

(顶点或边)属性组合的规范可以给出为

  1. 字符标量,

  2. 函数对象或

  3. 字符标量和/或函数对象的列表。

如果它是字符标量,则它指的是预定义的组合之一,请参阅下面的列表。

如果它是一个函数,则期望给定的函数执行组合。它将为图形中的每个新顶点/边调用一次,参数只有一个:映射到该单个顶点的顶点的属性值。

第三个选项,列表可用于为不同的属性指定不同的组合方法。列表的命名条目对应于具有相同名称的属性。列表的未命名条目(即如果名称为空字符串)指定默认的组合方法。即

list(weight="sum", "ignore")

指定新边的权重应该是旧图中相应边的权重之和;并且其余属性应被忽略(=丢弃)。

预定义的组合函数

以下组合行为是预定义的

"ignore"

该属性被忽略并丢弃。

"sum"

计算属性的总和。这不适用于字符属性,并且仅当为复杂属性定义了 sum 泛型时才有效。(例如,它适用于 Matrix 包中的稀疏矩阵,因为它们具有 sum 方法。)

"prod"

计算属性的乘积。这不适用于字符属性,并且仅当为复杂属性定义了 prod 函数时才有效。

"min"

计算并返回属性的最小值。对于字符和复杂属性,使用标准 R min 函数。

"max"

计算并返回属性的最大值。对于字符和复杂属性,使用标准 R max 函数。

"random"

统一随机地选择提供的属性值之一。对于字符和复杂属性,这是通过调用 sample 实现的。

"first"

始终选择第一个属性值。它是通过调用 head() 函数来实现的。

"last"

始终选择最后一个属性值。它是通过调用 tail() 函数来实现的。

"mean"

计算并返回属性的平均值。对于字符和复杂属性,这只是调用 mean() 函数。

"median"

选择属性的中位数。对所有属性类型调用 R median() 函数。

"concat"

使用 c() 函数连接属性。这几乎总是会产生一个复杂的属性。

参见

关于如何普遍使用图形/顶点/边属性,请参阅 graph_attr()vertex_attr()edge_attr()。关于 igraph 参数,请参阅 igraph_options()

顶点、边和图形属性 delete_edge_attr()delete_graph_attr()delete_vertex_attr()edge_attr()edge_attr<-()edge_attr_names()graph_attr()graph_attr<-()graph_attr_names()igraph-dollarigraph-vs-attributesset_edge_attr()set_graph_attr()set_vertex_attr()set_vertex_attrs()vertex_attr()vertex_attr<-()vertex_attr_names()

作者

Gabor Csardi csardi.gabor@gmail.com

示例


g <- make_graph(c(1, 2, 1, 2, 1, 2, 2, 3, 3, 4))
E(g)$weight <- 1:5

## print attribute values with the graph
igraph_options(print.graph.attributes = TRUE)
igraph_options(print.vertex.attributes = TRUE)
igraph_options(print.edge.attributes = TRUE)

## new attribute is the sum of the old ones
simplify(g, edge.attr.comb = "sum")
#> IGRAPH 24cb9bc D-W- 4 3 -- 
#> + attr: weight (e/n)
#> + edges from 24cb9bc:
#> [1] 1->2 2->3 3->4

## collect attributes into a string
simplify(g, edge.attr.comb = toString)
#> IGRAPH 75d7cb1 D-W- 4 3 -- 
#> + attr: weight (e/c)
#> + edges from 75d7cb1:
#> [1] 1->2 2->3 3->4

## concatenate them into a vector, this creates a complex
## attribute
simplify(g, edge.attr.comb = "concat")
#> IGRAPH e2a1ae7 D-W- 4 3 -- 
#> + attr: weight (e/x)
#> + edges from e2a1ae7:
#> [1] 1->2 2->3 3->4

E(g)$name <- letters[seq_len(ecount(g))]

## both attributes are collected into strings
simplify(g, edge.attr.comb = toString)
#> IGRAPH 2dd0af7 D-W- 4 3 -- 
#> + attr: weight (e/c), name (e/c)
#> + edges from 2dd0af7:
#> [1] 1->2 2->3 3->4

## harmonic average of weights, names are dropped
simplify(g, edge.attr.comb = list(
  weight = function(x) length(x) / sum(1 / x),
  name = "ignore"
))
#> IGRAPH faaf1ad D-W- 4 3 -- 
#> + attr: weight (e/n)
#> + edges from faaf1ad:
#> [1] 1->2 2->3 3->4