R语言如何用统一代码扁平化不同嵌套层级的动态列表
解决方案
方案1:基础R+data.table实现(无额外依赖)
无需封装函数的一行通用写法,直接替换代码中的XY变量即可使用:
library(data.table) res <- rbindlist(if(all(c("ZZ1","ZZ2","ZZ3") %in% names(XY$C))) list(XY$C) else XY$C, fill = TRUE)
核心逻辑是先判断C字段的第一层嵌套是否直接包含目标字段:
- 是(对应XY01结构):给
C外层套一层列表,和XY02的结构做统一对齐 - 否(对应XY02结构):直接用
C下的子列表做行合并
两种输入都能得到符合要求的输出:
ZZ1 ZZ2 ZZ3 1: A B C 2: D E F # XY02特有
方案2:递归实现(兼容任意嵌套深度)
如果后续可能出现更深的嵌套层级,可以用rrapply包做递归筛选,鲁棒性更强:
library(data.table) library(rrapply) res <- rrapply( XY$C, condition = function(x) all(c("ZZ1", "ZZ2", "ZZ3") %in% names(x)), f = as.data.table, how = "bind" )
该代码会自动遍历C下的所有嵌套层级,只要子列表同时包含三个目标字段就会被提取合并,不受中间嵌套层级的限制。
内容的提问来源于stack exchange,提问作者Saurabh
相关产品推荐
相关产品推荐

