如何用指定R包将CSV中的不规则层级结构扁平化?
不规则层级结构扁平化实现方案
需求说明
我有一个垂直展示不规则(ragged)层级结构的.csv文件,其中indent_nbr表示每个条目在层级中的级别(0代表顶级父节点),原始数据如下:
data <- data.frame( item = c("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R"), indent_nbr = c(0,1,2,3,4,4,4,5,5,5,5,4,5,5,5,5,3,4), stringsAsFactors = FALSE )
需要将其扁平化为每行对应一个叶子节点完整层级路径的矩阵形式:
[,1] [,2] [,3] [,4] [,5] [,6] [1,] "A" "B" "C" "D" "E" NA [2,] "A" "B" "C" "D" "F" NA [3,] "A" "B" "C" "D" "G" "H" [4,] "A" "B" "C" "D" "G" "I" [5,] "A" "B" "C" "D" "G" "J" [6,] "A" "B" "C" "D" "G" "K" [7,] "A" "B" "C" "D" "L" "M" [8,] "A" "B" "C" "D" "L" "N" [9,] "A" "B" "C" "D" "L" "O" [10,] "A" "B" "C" "D" "L" "P" [11,] "A" "B" "C" "Q" "R" NA
实现代码(仅使用base包)
以下代码通过维护当前层级路径、遍历更新路径并判断叶子节点,完成扁平化转换:
# 读取CSV数据(外部文件替换为read.csv("your_file.csv", stringsAsFactors = FALSE)) data <- data.frame( item = c("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R"), indent_nbr = c(0,1,2,3,4,4,4,5,5,5,5,4,5,5,5,5,3,4), stringsAsFactors = FALSE ) # 计算最大层级,确定矩阵列数 max_level <- max(data$indent_nbr) + 1 # 初始化结果列表与当前路径向量 result_list <- list() current_path <- rep(NA_character_, max_level) # 遍历每一行数据,更新路径并收集叶子节点的完整路径 total_rows <- nrow(data) for (idx in 1:total_rows) { current_indent <- data$indent_nbr[idx] # 重置当前层级之后的路径为NA,设置当前层级的节点值 current_path[(current_indent + 2):max_level] <- NA current_path[current_indent + 1] <- data$item[idx] # 判断是否为叶子节点:最后一行 或 下一行层级不大于当前层级 if (idx == total_rows || data$indent_nbr[idx + 1] <= current_indent) { result_list[[length(result_list) + 1]] <- current_path } } # 将结果列表转换为矩阵 flat_matrix <- do.call(rbind, result_list) # 查看结果 print(flat_matrix)
代码说明
- 路径维护:通过
current_path向量实时记录当前节点的完整层级路径,每次处理新节点时,先重置当前层级之后的位置为NA,再更新当前层级的节点值,确保路径的正确性。 - 叶子节点判断:当处理到最后一行,或下一行的层级不大于当前节点层级时,说明当前节点是叶子节点,将其完整路径加入结果列表。
- 矩阵转换:将收集到的所有叶子节点路径列表转换为矩阵,得到最终的扁平化结构。
内容的提问来源于stack exchange,提问作者gcbm1984
相关产品推荐
相关产品推荐

