减少树的节点数,以获得具有多个子节点的节点

Mar*_*ark 10 tree r

以下树:

在此输入图像描述

已从以下矩阵中获得

> 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
Run Code Online (Sandbox Code Playgroud)

将每个"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
Run Code Online (Sandbox Code Playgroud)

产生上面树的代码如下

> 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")
Run Code Online (Sandbox Code Playgroud)

我想修改树如下:(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的节点替换蓝色圆圈的节点

在此输入图像描述

Jua*_*íaz 7

试试这个:

  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)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述