在树创建期间在r函数中传递值时出错

mspsb9vt  于 2023-07-31  发布在  其他
关注(0)|答案(1)|浏览(91)

我尝试使用此代码从data.frame开始创建树。

library(data.tree)

# Creates table "mbom"
mbom <- data.frame(
  Lev. = c(1, 2, 3, 3, 2, 3, 4, 4),
  item = c("A", "B", "D", "E", "C", "F", "D", "E"),
  father = c(NA, "A", "B", "B", "A", "C", "F", "F")
)

# Function for tree creation
create_tree <- function(dataframe1, node_name = "A") {
  node <- Node$new(node_name)

  subset_dataframe1 <- subset(dataframe1, father == node_name)
  if (nrow(subset_dataframe1) > 0) {
    for (i in 1:nrow(subset_dataframe1)) {
      children <- subset_dataframe1$item[i]
      node_children <- create_tree(dataframe1, children)
      node$AddChild(node_children)
    }
  }
  
  return(node)
}

# Tree creation
mbom_tree <- create_tree(mbom)

字符串
预期输出为:

levelName
1  A
2  ¦--B
3  ¦   ¦--D
4  ¦   °--E
5  °--C
6      °--F
7          ¦--D
8          °--E


但在起跑线上

mbom_tree <- create_tree(mbom)


代码生成错误:

Error in as.vector(x, "character") : 
  cannot coerce type 'environment' to vector of type 'character'
Called from: as.character.default(name)


我已经尝试重新安装数据.帧包,但错误仍然存在.一旦我解决了这个小示例,我将扩展到由数千行和许多层次结构组成的层次结构。

v64noz0r

v64noz0r1#

正如在注解中已经提到的,这里不需要编写自定义函数。重新排列数据并创建一个定义路径的帮助字符串。然后你可以使用as.Node()。这里有一个例子(我想可以更简单):

library(data.tree)

mbom <- data.frame(
    father = c("A", "A", "B", "B"),
    item = c("B", "B", "C", "C"),
    item2 = c("D", "E", "F", "F"),
    item3 = c(NA, NA, "D", "E")
)

mbom$pathString <- do.call(paste, c(mbom,
                                    sep = "/")) |>
    stringr::str_replace_all("/NA", "")

as.Node(mbom)

      levelName
1 A            
2  ¦--B        
3  ¦   ¦--D    
4  ¦   °--E    
5  °--C        
6      °--F    
7          ¦--D
8          °--E

字符串

相关问题