【问题标题】:Plot a decision tree with R用 R 绘制决策树
【发布时间】:2016-07-13 09:41:31
【问题描述】:

我有一个 440*2 的矩阵,如下所示:

1   144
1   152
1   135
2   3
2   12
2   107
2   31
3   4
3   147
3   0
4   end
4   0
4   0
5   6
5   7
5   10
5   9

左列是起点,例如在应用程序中,左侧的所有 1 都在同一页面上。它们导致三个选择,第 144,152,135 页。然后这些页面可以各自指向另一个页面,依此类推,直到右侧列显示“结束”。我想要的是一种可视化这棵树的规模的方法。我意识到考虑到 nb 行,它会非常大,所以可能对图形不友好,所以为了清楚起见,我想知道总共有多少条可能的路线(从每个起点,到它提供的每个选项以及每个选项的最终目的地. 我意识到会有重叠,但这就是为什么我觉得这很难计算)。

其次,每个数字都有一个关联的标题。我想要一个函数,如果你输入一个给定的标题,它将绘制所有可能的起点及其相关的路径。这应该小得多,因此图形友好。

例如

dta <- "
14  12  as
186  187  Frac
187  154  Low
23   52   Med
52   11   Lip
15  55  asd
11   42   AAA
42   154   BBB
154   end  Coll"

编辑示例数据以显示某些分支未连接到所需的树

  dta <- "
  14  12  as
  186  187  Frac
  187  154  Low
  23   52   Med
  52   11   Lip
  11   42   AAA
  42   154   BBB
  154   end  Coll"

 dta <- gsub("   ", ",", dta, fixed = TRUE)   
 dta <- gsub("  ", ",", dta, fixed = TRUE)

df <- read.csv(textConnection(dta), stringsAsFactors = FALSE, header = FALSE)
names(df) <- c("from", "to", "nme")
library(data.tree)
Warning message:
package ‘data.tree’ was built under R version 3.2.5
tree <- FromDataFrameNetwork(df)
 **Error in FromDataFrameNetwork(df) :**
  **Cannot find root name. network is not a tree!**

我做了这个例子来展示第 1 列如何导致第 2 列中的值,然后引用第 1 列中的值,直到你到达末尾。不同的起点最终会导致到达同一目的地的不同长度的路径。所以这看起来像:

所以在这里,我想看看你如何从所有起点走到“科尔”

非常感谢任何帮助

【问题讨论】:

  • 我没有给你答案,但也许this 会有所帮助。
  • 感谢蒂姆。但是 rpart 不是对数据进行分类而不是按原样绘制吗?或者如果没有,我该如何让它像我上面描述的那样绘制树?
  • rpart.plot 中的 prp() 可以给你一些想法。在函数中查找代码。

标签: r


【解决方案1】:

如果你确实有一棵树(例如没有循环),你可以使用 data.tree:

首先转换为data.frame:

 dta <- "
14  12  as
186  187  Frac
187  154  Low
23   52   Med
52   11   Lip
15  55  asd
11   42   AAA
42   154   BBB
154   end  Coll
55  end  efg
12  end  hij"

dta <- gsub("   ", ",", dta, fixed = TRUE)
dta <- gsub("  ", ",", dta, fixed = TRUE)


df <- read.csv(textConnection(dta), stringsAsFactors = FALSE, header = FALSE)
names(df) <- c("from", "to", "nme")

现在,转换为 data.tree:

library(data.tree)
tree <- FromDataFrameNetwork(df)

tree$leafCount

您现在可以导航到任何子树进行分析和绘图。例如。使用以下任何一种可能性:

subTree <- tree$FindNode(187)
subTree <- Climb(tree, nme = "Coll", nme = "Low")
subTree <- tree$`154`$`187`

subTree <- Clone(tree$`154`)

也许您只需要打印:

print(subTree , "nme")

这将像这样打印:

  levelName          nme
1 154                Coll
2  ¦--187             Low
3  ¦   °--186        Frac
4  °--42              BBB
5      °--11          AAA
6          °--52      Lip
7              °--23  Med

否则,请使用精美的绘图:

SetNodeStyle(subTree , style = "filled,rounded", shape = "box", fontname = "helvetica", label = function(node) node$nme, tooltip = "name")
plot(subTree , direction = "descend")

看起来像这样:

【讨论】:

  • 这看起来很棒。但我给出的例子过于简单化了。真实数据更像是第一组,并非所有行都指向 Coll。您将如何绘制与 Coll 相关的行?
  • 您可以导航到任何子树,例如subTree &lt;- tree$FindNode(187)subTree &lt;- Climb(tree, nme = "Coll", nme = "Low")
  • 对不起,我不习惯这种工作,所以我的术语可能是错误的。我试图澄清这个例子。我无法导航到子树,因为原始数据框的行不会导致 coll,因此未连接到所需的树。这意味着我收到了我添加的错误代码以发布它不是树
  • 您的示例仍然是一棵树,但您缺少从 12 和 55 到 end 的引用。我相应地更新了答案。
  • 好的,但这现在是硬编码的。我希望只输入“Col”和数据框以及创建树的代码,而不必手动编写 187-->154 等,因为我将为不同的 Colls 做很多次。
猜你喜欢
  • 2013-02-09
  • 2015-12-18
  • 2014-08-30
  • 2016-11-09
  • 2017-02-21
  • 2017-01-30
  • 2017-10-23
  • 2016-05-07
  • 2018-12-21
相关资源
最近更新 更多