用R绘制决策树

时间:2016-07-13 09:41:31

标签: r

我有一个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行会非常大,所以可能没有图形友好,所以为了清楚起见我想知道总共有多少可能的路由(从每个起点开始,按每个选项给出的每个选项和每个的最终目的地)我意识到会有重叠,但这就是我发现这很难计算的原因。

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

e.g。

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列中的值,直到到达结尾。不同的起点最终可能导致到同一目的地的不同长度路径。所以这看起来像是: All paths leads to Coll

所以在这里,我想看看你如何从所有起点到'Coll'

非常感谢任何帮助

1 个答案:

答案 0 :(得分:2)

如果你确实有一棵树(例如没有循环),你可以使用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")

这看起来像这样:

enter image description here