【问题标题】:Reducing the number of nodes of a tree, to obtain nodes with more than one child node减少一棵树的节点数,获取具有多个子节点的节点
【发布时间】:2018-06-06 16:59:31
【问题描述】:

以下树:

已从以下矩阵中获得

> 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 的节点替换蓝色圈出的节点

【问题讨论】:

  • 您正在处理的图表有多大。是数百万、数千还是数百个节点?图是静态的,您可以假设节点数据在每个树通道中都是稳定的吗?即数据在算法过程中是稳定的。
  • @Technophobe01,图是静态的,我的节点不超过100个
  • 任何节点都可以有两个以上的孩子吗?
  • @JuanAntonioRoldánDíaz,是的。

标签: r tree


【解决方案1】:

试试这个:

  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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-17
    • 1970-01-01
    • 2015-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    相关资源
    最近更新 更多