如何仅基于共有行名合并20个行列数不同的dataframe
基于共有行名合并多个DataFrame(仅保留共有行)
你需要合并20个行列数不同的DataFrame,只保留所有DataFrame共有的行名对应的行,以下是两种高效的实现方法:
方法一:Base R 原生实现
步骤说明
- 把所有需要合并的DataFrame放到一个列表中(批量处理的核心)
- 提取所有DataFrame共有的行名
- 对每个DataFrame仅保留这些共有行
- 按行合并所有处理后的DataFrame
示例代码
# 构造你的示例数据 df1 <- data.frame( Patient1 = c(28,92,1,0,22), Patient64 = c(38,11,10,76,1002), Patient472 = c(0,998,282,56,778), row.names = c("ABC","XYZ","WWE","ICQ","SQL") ) df2 <- data.frame( Pat_9 = c(65,3,2,2,12), Pat_1 = c(44,311,1110,760,1200), Pat_111 = c(874,998,282,56,778), row.names = c("ABC","CBA","WWE","vVv","GHG") ) # 把所有需要合并的df放进列表(如果命名有规律,比如df1到df20,可用mget(paste0("df",1:20))) df_list <- list(df1, df2) # 提取所有df共有的行名 common_rows <- Reduce(intersect, lapply(df_list, rownames)) # 每个df只保留共有行(drop=FALSE避免单行列转成向量) filtered_dfs <- lapply(df_list, function(x) x[common_rows, , drop = FALSE]) # 合并结果 merged_result <- do.call(cbind, filtered_dfs) # 查看结果 print(merged_result)
运行后会得到你需要的合并结果:
Patient1 Patient64 Patient472 Pat_9 Pat_1 Pat_111 ABC 28 38 0 65 44 874 WWE 1 10 282 2 1110 282
方法二:Tidyverse 工具链实现
如果习惯用tidyverse的语法,代码会更简洁:
library(tidyverse) # 构造示例数据并把行名转为列 df1 <- data.frame( Patient1 = c(28,92,1,0,22), Patient64 = c(38,11,10,76,1002), Patient472 = c(0,998,282,56,778), row.names = c("ABC","XYZ","WWE","ICQ","SQL") ) %>% rownames_to_column("gene") df2 <- data.frame( Pat_9 = c(65,3,2,2,12), Pat_1 = c(44,311,1110,760,1200), Pat_111 = c(874,998,282,56,778), row.names = c("ABC","CBA","WWE","vVv","GHG") ) %>% rownames_to_column("gene") # 放入列表 df_list <- list(df1, df2) # 批量合并(inner_join自动保留所有df共有的gene) merged_result <- df_list %>% reduce(inner_join, by = "gene") %>% column_to_rownames("gene") # 查看结果 print(merged_result)
两种方法都支持批量处理20个DataFrame,只需要把所有df都加入到df_list中即可,不需要逐个手动处理。
内容的提问来源于stack exchange,提问作者Programming Noob
相关产品推荐
相关产品推荐

