Я хотел бы визуализировать некоторые глубоко вложенные данные с помощью networkD3. Я не могу понять, как преобразовать данные в правильный формат перед отправкой в radialNetwork
.
Вот несколько примеров данных:
level <- c(1, 2, 3, 4, 4, 3, 4, 4, 1, 2, 3)
value <- letters[1:11]
где level
указывает уровень гнезда, а value
- имя узла. Используя эти два вектора, мне нужно получить данные в следующем формате:
my_list <- list(
name = "root",
children = list(
list(
name = value[1], ## a
children = list(list(
name = value[2], ## b
children = list(list(
name = value[3], ## c
children = list(
list(name = value[4]), ## d
list(name = value[5]) ## e
)
),
list(
name = value[6], ## f
children = list(
list(name = value[7]), ## g
list(name = value[8]) ## h
)
))
))
),
list(
name = value[9], ## i
children = list(list(
name = value[10], ## j
children = list(list(
name = value[11] ## k
))
))
)
)
)
Вот ушедший объект:
> dput(my_list)
# structure(list(name = "root",
# children = list(
# structure(list(
# name = "a",
# children = list(structure(
# list(name = "b",
# children = list(
# structure(list(
# name = "c", children = list(
# structure(list(name = "d"), .Names = "name"),
# structure(list(name = "e"), .Names = "name")
# )
# ), .Names = c("name",
# "children")), structure(list(
# name = "f", children = list(
# structure(list(name = "g"), .Names = "name"),
# structure(list(name = "h"), .Names = "name")
# )
# ), .Names = c("name",
# "children"))
# )), .Names = c("name", "children")
# ))
# ), .Names = c("name",
# "children")), structure(list(
# name = "i", children = list(structure(
# list(name = "j", children = list(structure(
# list(name = "k"), .Names = "name"
# ))), .Names = c("name",
# "children")
# ))
# ), .Names = c("name", "children"))
# )),
# .Names = c("name",
# "children"))
Затем я могу передать его последней функции построения графика:
library(networkD3)
radialNetwork(List = my_list)
Результат будет выглядеть примерно так:
Вопрос: Как создать вложенный список?
Примечание. Как указано в @ zx8754, в этом SO post, но для этого требуется data.frame
в качестве ввода. Из-за непоследовательности моего level
я не вижу простого способа превратить его в data.frame
.
dput(my_list)
. Вдобавок входные данные неdata.frame
, и превратить их вdata.frame
непросто, ИМО, потому что уровни не согласованы. Вот почему я пометилrecursion
и подумал, что это может быть направление. Однако поправьте меня, если я ошибаюсь. - person Boxuan   schedule 15.12.2016df1 <- data.frame(level, value, stringsAsFactors = FALSE); split(df1, cumsum(df1$level == 1))
затем удалите минимальные значения и разделите на следующее минимальное значение и т. Д. - person zx8754   schedule 15.12.2016