Как вы выводите значения вдоль ветвей дерева в R? - PullRequest
0 голосов
/ 02 сентября 2018

Учитывая любой фрейм данных, как мне получить дерево или список, который сообщает мне значение вдоль каждой из ветвей дерева в R?

Например, если у меня есть фрейм данных, который выглядит следующим образом:

Gender      Under 18?   Student            
M           Y           Y
F           Y           Y
M           N           Y
M           Y           Y
F           N           N
M           N           N
F           N           N
F           Y           N
M           Y           N

Как вывести значения вдоль ветвей, как в дереве ниже?

Дерево со значениями вдоль ветвей

1 Ответ

0 голосов
/ 03 сентября 2018

Обычно дерево решений является результатом rpart или некоторого другого пакета на основе дерева, который создает правила принятия решений. Который затем может быть нанесен с помощью функции prp rpart.plot или fancyRpartPlot функции трещотки.

Но на основе вашего набора данных я создал функцию и набор кода (все из которых можно поместить в большую функцию). Igraph (или диаграмма) может быть использован для построения деревьев решений. Я использовал Igraph. Другие пакеты, необходимые для запуска, это dplyr и tidyr.

Код относительно гибкий, если у вас есть исходная таблица, такая же, как у вас. Итак, полный путь решения на строку.

На первом этапе создается функция для подсчета вхождений каждого пути принятия решения и добавления недостающих путей принятия решения. Следующие 2 шага создают метки вершин и ребер, необходимые для создания текста в узлах и вершинах. Операторы group by в этом коде необходимы для того, чтобы все значения оказались в правильном месте. Последний шаг - это создание графика и построение его с ребрами и вершинами. Картинка в этом посте - это результат, основанный на ваших данных. Если вам нужны разные метки вершин, как в вашем примере, вы можете сделать несколько операторов ifelse, но это не делает их гибкими. На рисунке показан результат на основе данных вашего примера.

Полный код ниже рисунка.

enter image description here

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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...