代码之家  ›  专栏  ›  技术社区  ›  Mark

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

  •  10
  • Mark  · 技术社区  · 7 年前

    以下树:

    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)如果用x标记的“n”级节点在用y标记的“n+1”级只有一个子节点,则程序将这两个节点合并到用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 回复  |  直到 7 年前
        1
  •  7
  •   Juan Antonio Roldán Dí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)
    

    enter image description here