如何在R语言中按列表名称合并嵌套列表
合并嵌套列表:按外层同名对象合并
问题描述
现有多个嵌套列表,它们的外层都包含相同名称的子列表(如layer_1、layer_2),需要将这些列表按外层名称合并,把对应层下的子元素整合到同一个列表中。示例输入如下:
# List object 1 list_1 <- list( L1 <- list( A1 <- c(1, 2, 3) ), L2 <- list( A1 <- c(1, 2, 3) )) names(list_1) <- c("layer_1", "layer_2") names(list_1$layer_1) <- c("A1") names(list_1$layer_2) <- c("A1") # List object 2 list_2 <- list( L1 <- list( B1 <- c(4, 5, 6) ), L2 <- list( B1 <- c(4, 5, 6) )) names(list_2) <- c("layer_1", "layer_2") names(list_2$layer_1) <- c("B1") names(list_2$layer_2) <- c("B1") # 待合并的大列表,可扩展包含list_3、list_4等 list_1_2 <- list(list_1, list_2)
期望输出结构:将所有子列表中layer_1的子元素合并,layer_2同理,最终得到每个外层列表下包含所有对应子元素的结构:
$layer_1 $layer_1$A1 [1] 1 2 3 $layer_1$B1 [1] 4 5 6 $layer_2 $layer_2$A1 [1] 1 2 3 $layer_2$B1 [1] 4 5 6
解决方案
方法1:Base R实现
无需额外包,通过循环和基础函数完成合并:
# 定义所有需要合并的外层名称(可根据需求添加layer_3等) target_layers <- c("layer_1", "layer_2") # 初始化结果列表 merged_list <- list() # 遍历每个外层名称,合并所有子列表中对应层的内容 for(layer in target_layers) { # 提取每个子列表中当前层的元素,合并为一个列表 merged_layer <- do.call(c, lapply(list_1_2, function(x) x[[layer]])) merged_list[[layer]] <- merged_layer } # 查看合并结果 merged_list
方法2:使用purrr包(简洁版)
如果使用tidyverse生态,purrr的函数可以让代码更简洁:
library(purrr) # 定义目标外层名称 target_layers <- c("layer_1", "layer_2") # 按层合并:先提取每个层的所有子元素,再合并为一个列表 merged_list <- map(target_layers, ~do.call(c, map(list_1_2, pluck, .x))) %>% set_names(target_layers) # 查看结果 merged_list
扩展说明
- 若需要合并更多子列表(如
list_3、list_4),只需将它们加入list_1_2这个大列表即可。 - 若外层包含
layer_3,只需在target_layers中添加该名称,代码会自动合并对应层的内容。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

