Сокращение количества узлов дерева, чтобы получить узлы с более чем одним дочерним узлом - PullRequest
0 голосов
/ 06 июня 2018

Следующее дерево:

enter image description here

было получено из следующей матрицы

> mat
7  23 47 41 31
7  23 53 41 31
7  23 53 41 37
7  29 47 41 31
7  29 47 41 37
7  29 53 41 31
7  29 53 41 37
11 29 53 41 31
11 29 53 41 37

, взяв каждый столбец 'mat'как уровень дерева.Если 'data' - это фрейм данных, в котором хранится матрица 'mat'

V1 V2 V3 V4 V5
7  23 47 41 31
7  23 53 41 31
7  23 53 41 37
7  29 47 41 31
7  29 47 41 37
7  29 53 41 31
7  29 53 41 37
11 29 53 41 31
11 29 53 41 37

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

> data$pathString<-paste("0", data$V1,data$V2,data$V3,data$V4,data$V5,sep = "/")
> p_tree <- as.Node(data)
> export_graph(ToDiagrammeRGraph(p_tree), "tree.png")

Я хотел бы изменить дерево какследующим образом: (1) если узел на уровне 'n', обозначенный номером x, имеет только один дочерний узел на уровне 'n + 1', обозначенный номером y, то программа объединяет эти два узла в один узел, обозначенный какрезультат произведения x * y;2) если узел на уровне 'n + 1' не имеет дочерних узлов, программа ничего не делает и запускается снова из другой ветви;3) если узел на уровне 'n + 1' имеет более одного дочернего узла, программа применяет точку (1) и запускается снова с каждого из дочерних узлов.

Например, для дерева нашего примера, код должен:

  • заменить узлы, обведенные красным, на узел, помеченный 31 * 41 * 47 = 59737
  • заменить узлы, обведенные оранжевым, на узел, помеченный 53* 41 = 2173
  • замените узлы, обведенные зеленым, узлом 47 * 41 = 1927
  • замените обведенные синим узлы узлом 11 * 29 * 53 * 41= 693187

enter image description here

1 Ответ

0 голосов
/ 11 июня 2018

Попробуйте это:

  freq <- sapply(1:ncol(data), function(x) {
  df <- data[, 1:x, drop = FALSE]

  cc <- aggregate(df[, 1], as.list(df), FUN = length)
  merge(df, cc, by = colnames(df), sort = FALSE)[, "x"]
  })

data$pathString <- sapply(1:nrow(data), function(x) {
  g <- 1
  for(i in 2:ncol(freq)) g <- c(g, 
        if(freq[x, i] == freq[x, i - 1]) g[i - 1] else g[i - 1] + 1)

  paste0(c("0", tapply(unlist(data[x, , drop = TRUE]), g, prod)), collapse = "/")
})


p_tree <- as.Node(data)

plot(p_tree)

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...