Я хотел бы визуализировать некоторые глубоко вложенные данные, используя 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
))
))
)
)
)
Вот является deparsed объект:
> 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
.
@ zx8754 Добавлено 'dput (my_list)'. Кроме того, входные данные не являются 'data.frame', а сделать его в' data.frame' непросто ИМО, потому что уровни несовместимы. Вот почему я отметил «рекурсию» и думаю, что это может быть направление. Однако, исправьте меня, если я ошибаюсь. – Boxuan
Нам нужна рекурсивная функция, которая будет принимать данные и раскол на минимальное значение, извините, нет времени для кода на данный момент. Что-то вроде: 'df1 <- data.frame (уровень, значение, строкиAsFactors = FALSE); split (df1, cumsum (df1 $ level == 1)) 'затем удалите значения min и разделите на следующее значение min и т. д. – zx8754
Я тоже об этом думал, но не был уверен, как пометить каждого ребенка на правильные родители. Другими словами, как можно предотвратить помечение значения 2-го уровня 2 первому родителю. – Boxuan