R语言使用purrr::flatten扁平化列表时保留层级命名的方法
解决方案
基于purrr的实现
核心用imap()同时获取上层分组名和对应值向量,按长度分支处理后扁平化即可:
library(purrr) result <- imap(test_list, \(vec, grp_nm) { if (length(vec) > 1) { imap(vec, ~ set_names(list(.x), .y) |> set_names(paste(grp_nm, .y, sep = " - "))) } else { set_names(list(vec), grp_nm) } }) |> flatten() # 验证结果 identical(result, want_list) #> [1] TRUE
纯base R实现
如果不想依赖第三方包,用基础循环也能实现相同逻辑,适配性同样很强:
result <- list() for (grp_nm in names(test_list)) { cur_vec <- test_list[[grp_nm]] if (length(cur_vec) > 1) { for (sub_nm in names(cur_vec)) { new_nm <- paste(grp_nm, sub_nm, sep = " - ") result[[new_nm]] <- cur_vec[sub_nm] } } else { result[[grp_nm]] <- cur_vec } }
逻辑说明
两种实现都遵循相同的处理规则:
- 遍历上层列表,同步拿到上层分组名和对应的子向量
- 仅当子向量长度>1时,拼接上层分组名和子元素名作为新的列表元素名
- 子向量长度=1时直接保留原上层分组名
- 所有处理后的子项最终合并为单层列表,支持任意长度的上层元素扩展
内容的提问来源于stack exchange,提问作者aiorr
相关产品推荐
相关产品推荐

