As a preface, your data is difficult to work because critical information is encoded in the order of values ββin level . I donβt know how you get these values ββin this order, but consider that there may be a better way to structure this information in the first place, which will facilitate the next task.
Here's a base -y way to convert your data into a data frame with two columns, parent and child , and then pass this to the data.tree functions, which can easily convert to the JSON format you need ... and then pass it to radialNetwork ...
level <- c(1, 2, 3, 4, 4, 3, 4, 4, 1, 2, 3) value <- letters[1:11] library(data.tree) library(networkD3) parent_idx <- sapply(1:length(level), function(n) rev(which(level[1:n] < level[n]))[1]) df <- data.frame(parent = value[parent_idx], child = value, stringsAsFactors = F) df$parent[is.na(df$parent)] <- "" list <- ToListExplicit(FromDataFrameNetwork(df), unname = T) radialNetwork(list)
Here's a tidyverse way to achieve the same ...
level <- c(1, 2, 3, 4, 4, 3, 4, 4, 1, 2, 3) value <- letters[1:11] library(tidyverse) library(data.tree) library(networkD3) data.frame(level, value, stringsAsFactors = F) %>% mutate(row = row_number()) %>% mutate(level2 = level, value2 = value) %>% spread(level2, value2) %>% mutate(`0` = "") %>% arrange(row) %>% fill(-level, -value, -row) %>% gather(parent_level, parent, -level, -value, -row) %>% filter(parent_level == level - 1) %>% arrange(row) %>% select(parent, child = value) %>% data.tree::FromDataFrameNetwork() %>% data.tree::ToListExplicit(unname = TRUE) %>% radialNetwork()
and for the bonus, the current version of dev networkD3 (v0.4.9000) has a new treeNetwork function that accepts a data frame with columns / variables nodeId and parentId , which eliminates the need for data.tree fucntions to convert to JSON, so something like this works .. .
level <- c(1, 2, 3, 4, 4, 3, 4, 4, 1, 2, 3) value <- letters[1:11] library(tidyverse) library(networkD3) data.frame(level, value, stringsAsFactors = F) %>% mutate(row = row_number()) %>% mutate(level2 = level, value2 = value) %>% spread(level2, value2) %>% mutate(`0` = "root") %>% arrange(row) %>% fill(-level, -value, -row) %>% gather(parent_level, parent, -level, -value, -row) %>% filter(parent_level == level - 1) %>% arrange(row) %>% select(nodeId = value, parentId = parent) %>% rbind(data.frame(nodeId = "root", parentId = NA)) %>% mutate(name = nodeId) %>% treeNetwork(direction = "radial")