将 ctree 输出转换为 JSON 格式(用于 D3 树布局)
Posted
技术标签:
【中文标题】将 ctree 输出转换为 JSON 格式(用于 D3 树布局)【英文标题】:Converting ctree output into JSON Format (for D3 tree layout) 【发布时间】:2014-10-26 14:43:44 【问题描述】:我正在处理一个需要运行ctree
然后以交互模式绘制它的项目——比如“D3.js”树布局,我的主要障碍是将ctree
输出转换为@ 987654325@ 格式,供javascript以后使用。
以下是我需要的(以虹膜数据为例):
> library(party)
> irisct <- ctree(Species ~ .,data = iris)
> irisct
Conditional inference tree with 4 terminal nodes
Response: Species
Inputs: Sepal.Length, Sepal.Width, Petal.Length, Petal.Width
Number of observations: 150
1) Petal.Length <= 1.9; criterion = 1, statistic = 140.264
2)* weights = 50
1) Petal.Length > 1.9
3) Petal.Width <= 1.7; criterion = 1, statistic = 67.894
4) Petal.Length <= 4.8; criterion = 0.999, statistic = 13.865
5)* weights = 46
4) Petal.Length > 4.8
6)* weights = 8
3) Petal.Width > 1.7
7)* weights = 46
现在我想使用某种算法(我手动完成)将ctee
输出转换为以下 JSON 格式,但这可能不是转换它的最佳方法:
"name" : "Petal.Length <= 1.9 criterion = 1","value": 60, "children" : [
"name" : "n=50" ,"value": 60,
"name" : "Petal.Length > 1.9 criterion = 1","value": 60, "children": [
"name" : "n=46","value": 60 ,
"name" : "Petal.Length > 4.8","value": 60, "children" :[
"name" : "Petal.Width > 1.7" ,"value": 60,
"name" : "46" ,"value": 60
]]
]
这是 R 和 D3.js
的两张图:
我已经尝试在 ctree 对象上使用 RJSONIO
,但这并没有太大帮助。
有没有人将 ctree 对象/输出转换为 JSON 以使用 D3.js 树布局?如果没有,是否有人知道可以将一个输出转换为另一个输出的算法?
提前感谢您的帮助!
【问题讨论】:
【参考方案1】:诀窍是提取irisct
对象的有用位,然后仅将其转换为 JSON。像这样的:
get_ctree_parts <- function(x, ...)
UseMethod("get_ctree_parts")
get_ctree_parts.BinaryTree <- function(x, ...)
get_ctree_parts(attr(x, "tree"))
get_ctree_parts.SplittingNode <- function(x, ...)
with(
x,
list(
nodeID = nodeID,
variableName = psplit$variableName,
splitPoint = psplit$splitpoint,
pValue = 1 - round(criterion$maxcriterion, 3),
statistic = round(max(criterion$statistic), 3),
left = get_ctree_parts(x$left),
right = get_ctree_parts(x$right)
)
)
get_ctree_parts.TerminalNode <- function(x, ...)
with(
x,
list(
nodeID = nodeID,
weights = sum(weights),
prediction = prediction
)
)
useful_bits_of_irisct <- get_ctree_parts(irisct)
toJSON(useful_bits_of_irisct)
我通过明智地使用unclass
函数得出了这个答案。例如:
unclass(irisct)
unclass(attr(irisct, "tree"))
unclass(attr(irisct, "tree")$psplit)
包中的打印方法party:::print.SplittingNode
和party:::print.TerminalNode
也非常有用。 (输入 party:::print.
并自动完成以查看可用的内容。)
【讨论】:
以上是关于将 ctree 输出转换为 JSON 格式(用于 D3 树布局)的主要内容,如果未能解决你的问题,请参考以下文章