Box*_*uan 7 recursion r nested-lists networkd3
我想使用networkD3可视化一些深层嵌套的数据.在发送之前,我无法弄清楚如何将数据转换成正确的格式radialNetwork.
以下是一些示例数据:
level <- c(1, 2, 3, 4, 4, 3, 4, 4, 1, 2, 3)
value <- letters[1:11]
Run Code Online (Sandbox Code Playgroud)
where 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
))
))
)
)
)
Run Code Online (Sandbox Code Playgroud)
这是解除对象:
> 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"))
Run Code Online (Sandbox Code Playgroud)
然后我可以将它传递给最终的绘图功能:
library(networkD3)
radialNetwork(List = my_list)
Run Code Online (Sandbox Code Playgroud)
输出看起来类似于:
问题:如何创建嵌套列表?
注意:正如@ zx8754所指出的,在这篇SO帖子中已经有了一个解决方案,但这需要data.frame作为输入.由于我的不一致level,我没有看到一个简单的方法将其转换为data.frame.
使用data.table-style 合并:
library(data.table)
dt = data.table(idx=1:length(value), level, parent=value)
dt = dt[dt[, .(i=idx, level=level-1, child=parent)], on=.(level, idx < i), mult='last']
dt[is.na(parent), parent:= 'root'][, c('idx','level'):= NULL]
> dt
# parent child
# 1: root a
# 2: a b
# 3: b c
# 4: c d
# 5: c e
# 6: b f
# 7: f g
# 8: f h
# 9: root i
# 10: i j
# 11: j k
Run Code Online (Sandbox Code Playgroud)
现在我们可以使用其他帖子中的解决方案:
x = maketreelist(as.data.frame(dt))
> identical(x, my_list)
# [1] TRUE
Run Code Online (Sandbox Code Playgroud)