首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >减少树的节点数,以获得具有多个子节点的节点

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

Stack Overflow用户
提问于 2018-06-06 16:59:31
回答 1查看 424关注 0票数 10

以下树:

已从下列矩阵中获得

代码语言:javascript
运行
复制
> 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”的数据

代码语言:javascript
运行
复制
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

生成上述树的代码如下

代码语言:javascript
运行
复制
> 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‘级节点在'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标记的节点替换蓝色圈的节点

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-11 10:56:33

试试这个:

代码语言:javascript
运行
复制
  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)

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50725780

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档