| Combining attributes {igraph} | R Documentation |
Many times, when the structure of a graph is modified,
vertices/edges map of the original graph map to vertices/edges in the
newly created (modified) graph. For example simplify
maps multiple edges to single edges. igraph provides a flexible
mechanism to specify what to do with the vertex/edge attributes in
these cases.
The functions that support the combination of attributes have one or
two extra arguments called vertex.attr.comb and/or
edge.attr.comb that specify how to perform the mapping of the
attributes. E.g. contract.vertices contracts many
vertices into a single one, the attributes of the vertices can be
combined and stores as the vertex attributes of the new graph.
The specification of the combination of (vertex or edge) attributes can be given as
a character scalar,
a function object or
a list of character scalars and/or function objects.
If it is a character scalar, then it refers to one of the predefined combinations, see their list below.
If it is a function, then the given function is expected to perform the combination. It will be called once for each new vertex/edge in the graph, with a single argument: the attribute values of the vertices that map to that single vertex.
The third option, a list can be used to specify different combination methods for different attributes. A named entry of the list corresponds to the attribute with the same name. An unnamed entry (i.e. if the name is the empty string) of the list specifies the default combination method. I.e.
list(weight="sum", "ignore")specifies that the weight of the new edge should be sum of the weights of the corresponding edges in the old graph; and that the rest of the attributes should be ignored (=dropped).
The following combination behaviors are predefined:
The attribute is ignored and dropped.
The sum of the attributes is calculated. This
does not work for character attributes and works for complex
attributes only if they have a sum generic
defined. (E.g. it works for sparse matrices from the Matrix
package, because they have a sum method.)
The product of the attributes is
calculated. This does not work for character attributes and
works for complex attributes only if they have a prod
function defined.
The minimum of the attributes is calculated and
returned. For character and complex attributes the standard R
min function is used.
The maximum of the attributes is calculated and
returned. For character and complex attributes the standard R
max function is used.
Chooses one of the supplied attribute
values, uniformly randomly. For character and complex attributes
this is implemented by calling sample.
Always chooses the first attribute value. It
is implemented by calling the head function.
Always chooses the last attribute value. It is
implemented by calling the tail function.
The mean of the attributes is calculated and
returned. For character and complex attributes this simply calls
the mean function.
The median of the attributes is
selected. Calls the R median function for all attribute
types.
Concatenate the attributes, using the
c function. This results almost always a complex
attribute.
The are two standard igraph parameters that define the default
behavior when combining vertices and edges: vertex.attr.comb
specifies how to combine vertices by default, edge.attr.comb
does the same for edges.
E.g. if you want to drop all vertex attributes when combining vertices, you can specify
igraph.options(vertex.attr.comb="ignore")As another example, if – when combining edges – you want to keep the mean weight of the edges, concatenate their names into a single character scalar, and drop everything else, then use
igraph.options(edge.attr.comb=list(weight="mean",
name=toString, "ignore")
An attribute is simple if (for all vertices/edges) it can be specified as an atomic vector. Character and numeric attributes are always simple. E.g. a vertex attribute that is a numeric vector of arbitrary length for each vertex, is a complex attribute.
Combination of attributes might turn a complex attribute into a single one, and the opposite is possible, too. E.g. when contatenating attribute values to form the new attribute value, the result will be typically a complex attribute.
See also examples below.
Gabor Csardi csardi.gabor@gmail.com
attributes on how to use
graph/vertex/edges attributes in general. igraph.options on
igraph parameters.
g <- 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")
## collect attributes into a string
simplify(g, edge.attr.comb=toString)
## concatenate them into a vector, this creates a complex
## attribute
simplify(g, edge.attr.comb="concat")
E(g)$name <- letters[seq_len(ecount(g))]
## both attributes are collected into strings
simplify(g, edge.attr.comb=toString)
## harmonic average of weights, names are dropped
simplify(g, edge.attr.comb=list(weight=function(x) length(x)/sum(1/x),
name="ignore"))