I have a dataframe
test <- structure(list( y2002 = c("freshman","freshman","freshman","sophomore","sophomore","senior"), y2003 = c("freshman","junior","junior","sophomore","sophomore","senior"), y2004 = c("junior","sophomore","sophomore","senior","senior",NA), y2005 = c("senior","senior","senior",NA, NA, NA)), .Names = c("2002","2003","2004","2005"), row.names = c(c(1:6)), class = "data.frame") > test 2002 2003 2004 2005 1 freshman freshman junior senior 2 freshman junior sophomore senior 3 freshman junior sophomore senior 4 sophomore sophomore senior <NA> 5 sophomore sophomore senior <NA> 6 senior senior <NA> <NA>
and I want to create a graph that should resemble the ugly text art below:
freshman ---- junior ----------------------\ freshman ---- junior --- sophomore -------- senior sophomore
In other words, I need to show on the graph the possible paths to the "senior", giving the weights to the ribs in accordance with the number of cases using this path.
First attempt This code generates a graph, but not one that is similar to the text above.
library(igraph) elist <- lapply(seq_len(nrow(test)), function(i) { x <- as.character(test[i,]) x <- unique(na.omit(x)) x <- rep(x, each=2) x <- x[-1] x <- x[-length(x)] r <- matrix(x, ncol=2, byrow=TRUE) if (nrow(r) > 0) { r <- cbind(r, i) } else { r <- cbind(r, numeric()) } r }) result <- as.data.frame(do.call(rbind, elist)) names(result) <- c("vertex","edge", "id") categories <- data.frame(name=c("freshman","junior","sophomore","senior")) g <- graph.data.frame(result,directed=T,vertices=categories) g <- set.edge.attribute(g, "weight", value=runif(ecount(g))*10) igraph.par("plot.layout", layout.reingold.tilford) plot(g, vertex.label=categories$name, vertex.label.dist=7, edge.width=get.edge.attribute(g,"weight"), edge.arrow.size=1.5)
Result (not what I wanted)

** This question is related to this post *
** And this post is a necessary step to resolve this issue *