我的最终游戏是使用D3js从分层JSON文件创建树形图。R使用JSONLITE分层JSON?
我需要表示的等级是这张图,其中A有孩子B,C,D; B有孩子E,F,G; C有孩子H,I; D没有孩子。节点将具有多个键:值对。为简单起见,我仅列出3个。 R中
-- name:E
| type:dkBlue
| id: 005
|
|-- name:F
-- name:B ------| type:medBlue
| type:blue | id: 006
| id:002 |
| |-- name:G
| type:ltBlue
name:A ----| id:007
type:colors|
id:001 |-- name:C ----|-- name:H
| type:red | type:dkRed
| id:003 | id:008
| |
| |
| |-- name:I
| type:medRed
| id:009
|-- name:D
type:green
id: 004
我的源数据是这样的:
nodes <-read.table(header = TRUE, text = "
ID name type
001 A colors
002 B blue
003 C red
004 D green
005 E dkBlue
006 F medBlue
007 G ltBlue
008 H dkRed
009 I medRed
")
links <- read.table(header = TRUE, text = "
startID relation endID
001 hasSubCat 002
001 hasSubCat 003
001 hasSubCat 004
002 hasSubCat 005
002 hasSubCat 006
002 hasSubCat 007
003 hasSubCat 008
003 hasSubCat 009
")
我必须把它转换成以下JSON:
{"name": "A",
"type": "colors",
"id" : "001",
"children": [
{"name": "B",
"type": "blue",
"id" : "002",
"children": [
{"name": "E",
"type": "dkBlue",
"id" : "003"},
{"name": "F",
"type": "medBlue",
"id": "004"},
{"name": "G",
"type": "ltBlue",
"id": "005"}
]},
{"name": "C",
"type": "red",
"id" : "006",
"children": [
{"name": "H",
"type": "dkRed",
"id" : "007"},
{"name": "I",
"type": "dkBlue",
"id": "008"}
]},
{"name": "D",
"type": "green",
"id" : "009"}
]}
我希望你可以提供任何帮助!
[更新2017年4月18日]
基于伊恩的引用我看着成R的data.tree。如果我重构我的数据,我可以重新创建我的层次结构,如下所示。请注意,我已经失去了每个节点之间的关系类型(hasSubcat),其值在现实生活中对于每个链接/边缘都会有所不同。如果我能得到可行的层次结构,我愿意放手(现在)。对于data.tree修订后的数据:
df <-read.table(header = TRUE, text = "
paths type id
A colors 001
A/B blue 002
A/B/E dkBlue 005
A/B/F medBlue 006
A/B/G ltBlue 007
A/C red 003
A/C/H dkRed 008
A/C/I medRed 009
A/D green 004
")
myPaths <- as.Node(df, pathName = "paths")
myPaths$leafCount/(myPaths$totalCount - myPaths$leafCount)
print(myPaths, "type", "id", limit = 25)
打印显示我在原来的职位勾勒出层次,甚至包含键:对每个节点的值。太好了!
levelName type id
1 A colors 1
2 ¦--B blue 2
3 ¦ ¦--E dkBlue 5
4 ¦ ¦--F medBlue 6
5 ¦ °--G ltBlue 7
6 ¦--C red 3
7 ¦ ¦--H dkRed 8
8 ¦ °--I medRed 9
9 °--D green 4
再一次,我对如何将这个从树转换为嵌套的JSON感到遗憾。这里的示例https://ipub.com/data-tree-to-networkd3/与大多数示例一样,仅在叶节点上使用键:值对,而不在分支节点上使用。我认为答案是创建一个嵌套的列表来提供给JSONIO或JSONLITE,我不知道该怎么做。
你可能想看看这个:http://stackoverflow.com/questions/12818864/how-to-write-to-json-with-children-from-r –
嗨伊恩,你举的例子让我接近,但我正在努力使它适应于我为树中每个“节点”所需的Key:Value对的点。该示例中的递归方法仅为终端节点提供了键值对。 – Tim
蒂姆,你的问题很复杂,我需要破解一下,不幸的是我现在没有时间。有人比我更擅长解决问题的速度。如果您在递归方法中遇到问题,另一个选择是从顶部向下构建一棵树,这个树更容易概念化。这里是data.tree包的参赛者:https://cran.r-project.org/web/packages/data.tree/vignettes/data.tree.html。您可以添加每个孩子,然后按名称为每个孩子添加属性。然后,您可以使用以下内容将这些导出到JSON: –