R: Merging Parts of a Graph Together
I am working with the R programming language.
I have the following "Tree" that depicts the results of a coin flipping game (start at 5 points, and 0.5 prob of +1 and 0.5 prob of -1 at each turn):
outcomes <- c(-1, 1)
combinations <- expand.grid(rep(list(outcomes), 10))
colnames(combinations) <- paste("Turn", 1:10)
library(data.tree)
generate_tree <- function(node, depth, total) {
if (depth == 0) {
node$Set(total = total)
return(node)
} else {
for (outcome in outcomes) {
child <- node$AddChild(name = as.character(total + outcome), total = total + outcome)
generate_tree(child, depth - 1, total + outcome)
}
return(node)
}
}
root <- Node$new("Start", total = 5)
root <- generate_tree(root, 4, 5)
print(root, "total")
plot(root, "total")
My Question: Is it possible to reformat (i.e. merge) this graph such that at each turn, all "nodes" with the same "value" are collapsed into a single node? This would mean that at each turn, a given "value" could only appear once.
After reading the following references (How to collapse branches in a phylogenetic tree by the label in their nodes or leaves?, Plotting a tree - collapsing a vector of nodes) tried to do this with the following code:
collapse_nodes <- function(node) {
if (node$isRoot) {
return(node)
} else {
parent <- node$parent
siblings <- parent$children
same_value_siblings <- siblings[sapply(siblings, function(x) x$total == node$total)]
if (length(same_value_siblings) > 1) {
node$parent <- NULL
parent$RemoveChild(node$name)
}
return(node)
}
}
root <- Traverse(root, collapse_nodes, mode = "post-order")
print(root, "total")
plot(root, "total")
Unfortunately, I got the following error:
Error in Traverse(root, collapse_nodes, mode = "post-order") :
unused argument (mode = "post-order")
Can someone please suggest how to resolve this problem? Thanks!
Note: In the end, all nodes of the same color will merged into a single node - this is what I am trying to achieve:
Comments
Post a Comment