将ctree输出转换为JSON格式(用于D3树布局)

Yeh*_*ens 7 treeview json r decision-tree d3.js

我正在开发一个需要运行a ctree然后以交互模式绘制它的项目- 比如'D3.js'树布局,我的主要障碍是将ctree输出转换为json格式,以后由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 
Run Code Online (Sandbox Code Playgroud)

现在我想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}
    ]}] }
      ]}
Run Code Online (Sandbox Code Playgroud)

以下是R和D3.js图的两张图片:

在此输入图像描述 在此输入图像描述

我已经尝试过使用RJSONIOctree对象,这没有多大帮助.

有没有人曾将ctree对象/输出转换为JSON以使用D3.js树布局?如果没有,有没有人知道一个算法可以将一个输出转换为另一个?

在此先感谢您的帮助!

Ric*_*ton 7

诀窍是提取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)
Run Code Online (Sandbox Code Playgroud)

通过明智地使用该unclass功能,我想出了这个答案.例如:

unclass(irisct)
unclass(attr(irisct, "tree"))
unclass(attr(irisct, "tree")$psplit)
Run Code Online (Sandbox Code Playgroud)

打印方法在包,party:::print.SplittingNode并且party:::print.TerminalNode也是非常有用的.(键入party:::print.并自动完成以查看可用内容.)