You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在R中对嵌套子列表中的data.frame执行rbind合并操作

合并嵌套列表中对应位置的数据框

现有如下定义的嵌套列表mylist,每个一级子列表内包含3个数据框,需求是将所有一级子列表中同一位置的数据框通过rbind进行行合并,最终得到结构如示例所示的new_mylist。

原始列表定义

mylist <- list(list(structure(list(beta = c(48.8486939314123, -0.791098772521124, 
-17.1655206378182, -5.71137384209288, 5.48759276652723, 32.9922867794022, 
2.678027817518, 7.07190050739792, 1.2366953771653, 3.34913038674097
), name = c("V3", "V4", "V5", "V6", "V7", "V3", "V4", "V5", "V6", 
"V7"), variant = c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L), site = c(1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L)), row.names = c("V3", "V4", 
"V5", "V6", "V7", "V31", "V41", "V51", "V61", "V71"), class = "data.frame"), 
    structure(list(gamma = c(-3.3478378772043, -4.08286261159924
    ), variant = 1:2, site = c(1L, 1L)), row.names = c(NA, -2L
    ), class = "data.frame"), structure(list(alpha = c(0.676035079065653, 
    1.05834914172426), variant = 1:2, site = c(1L, 1L)), row.names = c(NA, 
    -2L), class = "data.frame")), list(structure(list(beta = c(32.9922867794022, 
2.678027817518, 7.07190050739792, 1.2366953771653, 3.34913038674097, 
48.8486939314123, -0.791098772521124, -17.1655206378182, -5.71137384209288, 
5.48759276652723), name = c("V3", "V4", "V5", "V6", "V7", "V3", 
"V4", "V5", "V6", "V7"), variant = c(1L, 1L, 1L, 1L, 1L, 2L, 
2L, 2L, 2L, 2L), site = c(2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L)), row.names = c("V3", "V4", "V5", "V6", "V7", "V31", "V41", 
"V51", "V61", "V71"), class = "data.frame"), structure(list(gamma = c(-4.08286261159924, 
-3.3478378772043), variant = 1:2, site = c(2L, 2L)), row.names = c(NA, 
-2L), class = "data.frame"), structure(list(alpha = c(1.05834914172426, 
0.676035079065653), variant = 1:2, site = c(2L, 2L)), row.names = c(NA, 
-2L), class = "data.frame")))

解决方法

以下提供两种可行的实现方式:

方式1:基础R实现

利用mapply遍历对应位置的数据框,批量执行行合并,同时处理重复行名问题:

# 合并对应位置的数据框
new_mylist <- mapply(function(...) do.call(rbind, list(...)), 
                     mylist[[1]], mylist[[2]], SIMPLIFY = FALSE)

# 为第一个数据框的重复行名添加后缀,避免冲突
rownames(new_mylist[[1]]) <- make.unique(rownames(new_mylist[[1]]))

方式2:tidyverse工具实现

使用purrr包转置列表结构后,再批量合并:

library(purrr)

new_mylist <- mylist %>%
  transpose() %>%  # 转置列表,将对应位置的数据框归为一组
  map(~ do.call(rbind, .x)) %>%  # 对每组数据框执行行合并
  map(~ {rownames(.x) <- make.unique(rownames(.x)); .x})  # 处理重复行名

最终结果

运行上述代码后,new_mylist的输出结构如下:

new_mylist
[[1]]
            beta name variant site
V3    48.8486939   V3       1    1
V4    -0.7910988   V4       1    1
V5   -17.1655206   V5       1    1
V6    -5.7113738   V6       1    1
V7     5.4875928   V7       1    1
V31   32.9922868   V3       2    1
V41    2.6780278   V4       2    1
V51    7.0719005   V5       2    1
V61    1.2366954   V6       2    1
V71    3.3491304   V7       2    1
V32   32.9922868   V3       1    2
V42    2.6780278   V4       1    2
V52    7.0719005   V5       1    2
V62    1.2366954   V6       1    2
V72    3.3491304   V7       1    2
V311  48.8486939   V3       2    2
V411  -0.7910988   V4       2    2
V511 -17.1655206   V5       2    2
V611  -5.7113738   V6       2    2
V711   5.4875928   V7       2    2

[[2]]
      gamma variant site
1 -3.347838       1    1
2 -4.082863       2    1
3 -4.082863       1    2
4 -3.347838       2    2

[[3]]
      alpha variant site
1 0.6760351       1    1
2 1.0583491       2    1
3 1.0583491       1    2
4 0.6760351       2    2

内容的提问来源于stack exchange,提问作者Adrian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 10:45:38