【问题标题】:Converting ctree output into JSON Format (for D3 tree layout)将 ctree 输出转换为 JSON 格式(用于 D3 树布局)
【发布时间】: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 树布局?如果没有,是否有人知道可以将一个输出转换为另一个输出的算法?

提前感谢您的帮助!

【问题讨论】:

    标签: json r d3.js treeview decision-tree


    【解决方案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.SplittingNodeparty:::print.TerminalNode 也非常有用。 (输入 party:::print. 并自动完成以查看可用的内容。)

    【讨论】:

      猜你喜欢
      • 2016-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-20
      • 2019-12-16
      • 2018-06-20
      相关资源
      最近更新 更多