Обычно дерево решений является результатом rpart или некоторого другого пакета на основе дерева, который создает правила принятия решений. Который затем может быть нанесен с помощью функции prp
rpart.plot или fancyRpartPlot
функции трещотки.
Но на основе вашего набора данных я создал функцию и набор кода (все из которых можно поместить в большую функцию). Igraph (или диаграмма) может быть использован для построения деревьев решений. Я использовал Igraph. Другие пакеты, необходимые для запуска, это dplyr и tidyr.
Код относительно гибкий, если у вас есть исходная таблица, такая же, как у вас. Итак, полный путь решения на строку.
На первом этапе создается функция для подсчета вхождений каждого пути принятия решения и добавления недостающих путей принятия решения. Следующие 2 шага создают метки вершин и ребер, необходимые для создания текста в узлах и вершинах. Операторы group by в этом коде необходимы для того, чтобы все значения оказались в правильном месте. Последний шаг - это создание графика и построение его с ребрами и вершинами. Картинка в этом посте - это результат, основанный на ваших данных. Если вам нужны разные метки вершин, как в вашем примере, вы можете сделать несколько операторов ifelse, но это не делает их гибкими. На рисунке показан результат на основе данных вашего примера.
Полный код ниже рисунка.
![enter image description here](https://i.stack.imgur.com/jnuE6.png)
library(tidyr)
library(dplyr)
library(igraph)
# count all the rules at the total grouped level
# add a line for each missing path with a 0
complete_df <- function(dat){
vars <- names(dat)
dat %>%
group_by_all %>%
summarise(n = n()) %>%
ungroup %>%
complete(!!!rlang::syms(vars), fill = list(n = 0)) ##
}
dat <- complete_df(df1)
vertex_labels <- sum(dat$n)
for(i in seq_along(dat[, -ncol(dat)])) {
out <- dat %>%
select(1:i, n) %>%
group_by_if(is.character) %>%
summarise(total = sum(n)) %>%
ungroup() %>%
pull(total)
vertex_labels <- c(vertex_labels, out)
}
# labels for inside the nodes
edge_labels <- NULL
for(i in seq_along(dat[, -ncol(dat)])) {
out <- dat %>%
select(1:i) %>%
group_by_if(is.character) %>%
distinct %>%
pull(i)
edge_labels <- c(edge_labels, out)
}
plot(graph.tree(2^(ncol(dat)) - 1, 2),
layout=layout_as_tree,
edge.label = edge_labels,
vertex.label = vertex_labels
)
данные:
df1 <- structure(list(Gender = c("M", "F", "M", "M", "F", "M", "F", "F", "M"),
Under_18 = c("Y", "Y", "N", "Y", "N", "N", "N", "Y", "Y"),
Student = c("Y", "Y", "Y", "Y", "N", "N", "N", "N", "N")),
class = "data.frame", row.names = c(NA, -9L))