I have network data--nodes & edges (to/from)--and would like to construct absolute paths from it. For instance, consider the following data set.
From | To |
A | B |
A | C |
C | D |
D | E |
I would like to return the following:
A -> B
A -> C -> D -> E
Is there a convenient way to do this in Alteryx?
Solved! Go to Solution.
Hi @fnoahbiro
I have attached a workflow which groups the node and edges together.
I assumed the paths start with 'A'.
Additional annotations are in the workflow.
Best,
Jordan Barker
Solutions Consultant
What if the root is unknown? That is, we can't specify starting from A.
Hi @fnoahbiro,
Not understanding the structure of your data, you will need to think of some logic which decides what is the starting node, or separates the different nodes.
In the attached workflow I assumed the first value in the 'from' column would be repeated and therefore would be the start of a new node.
I hope this helps.
best,
Jordan Barker
Solutions Consultant
Hi @fnoahbiro,
Not understanding the structure of your data, you will need to think of some logic which decides what is the starting node, or separates the different nodes.
In the attached workflow I assumed the first value in the 'from' column would be repeated and therefore would be the start of a new node.
I hope this helps.
best,
Jordan Barker
Solutions Consultant
Throw this into the R tool and check the output. Note the code is partially sanitized (***).
df_all <- read.Alteryx('#1', mode = 'data.frame')
# load libraries
library(igraph, quietly = TRUE)
# list distinct *** (filepaths)
z <- unique(df_all$filepath)
# define data frame for hierarchy data
h <- data.frame(filepath = character(0), hierarchy = character(0))
# construct hierarchy for ***
for (i in seq(z)) {
# subset records for current file
f <- z[i]
df <- subset(df_all, df_all$filepath == f)
# get distinct nodes
nodes_from <- df[, 1, drop = F]
colnames(nodes_from) <- c('name')
nodes_to <- df[, 2, drop = F]
colnames(nodes_to) <- c('name')
nodes <- unique(rbind(nodes_from, nodes_to))
# clean relations
edges <- df[, c(1, 2)]
# create graph object
g <- graph_from_data_frame(edges, vertices = nodes)
# extract root and leaves
root <- which(degree(g, v = V(g), mode = "in")==0, useNames = T)
leaves <- which(degree(g, v = V(g), mode = "out")==0, useNames = T)
# generate paths
path_list <- all_simple_paths(g, from = root, to = leaves)
# convert path list into a data frame
t <- as.data.frame(cbind(lapply(path_list, function(x) paste(x$name, collapse = '>'))))
# append filename and update column names
t <- data.frame(f, t)
colnames(t) <- c('filepath', 'hierarchy')
# append records
h <- rbind(h, t)
}
# output
h[] <- lapply(h, as.character)
AlteryxMessage('Path builder complete.', msg.consts$INFO, priority.consts$LOW )
write.Alteryx(h, 1)
Hi
Is it possible to share the alteryx workflow?. Iam looking for all possible combinations and also an indicator of the shortest path.
Thanks
R