如何在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
相关产品推荐
相关产品推荐

