我想使用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
标签,并认为这可能是正确的方向。但如果我错了,请纠正我。 - Boxuandf1 <- data.frame(level, value, stringsAsFactors = FALSE); split(df1, cumsum(df1$level == 1))
然后删除最小值,并在下一个最小值处进行拆分,以此类推。 - zx8754