在R中按pathway列合并频次不同的两个数据框
R语言按pathway列合并数据框并保留高频次行数的解决方案
你的需求核心是避免普通合并带来的笛卡尔积,同时保留频次更高的数据框的行数,给缺失匹配的行填充NA。可以通过给每个pathway的重复行添加组内序号,再基于pathway和序号进行精确匹配来实现。
方法一:使用dplyr包(推荐,语法直观)
步骤:
- 为两个数据框按
pathway分组,添加组内行号,用于区分同一路径的不同重复行 - 以df1为基础做左连接,匹配条件为
pathway和组内行号 - 移除临时添加的行号列
代码示例:
# 加载dplyr包 library(dplyr) # 构造模拟数据(替换成你的实际数据) df1 <- data.frame( pathway = c(rep("HALLMARK_ADIPOGENESIS", 6), rep("HALLMARK_INFLAMMATORY_RESPONSE", 3)), _B1_7486 = rnorm(9) ) df2 <- data.frame( pathway = c(rep("HALLMARK_ADIPOGENESIS", 4), rep("HALLMARK_INFLAMMATORY_RESPONSE", 5)), _B1_7534 = rnorm(9) ) # 给df1添加组内行号 df1_with_id <- df1 %>% group_by(pathway) %>% mutate(row_id = row_number()) %>% ungroup() # 给df2添加组内行号 df2_with_id <- df2 %>% group_by(pathway) %>% mutate(row_id = row_number()) %>% ungroup() # 左连接合并,保留df1的所有行 combined_df <- df1_with_id %>% left_join(df2_with_id, by = c("pathway", "row_id")) %>% select(-row_id) # 删除临时行号列
方法二:使用base R(无需额外安装包)
如果不想加载dplyr,用base R的ave()函数生成组内行号,再做左连接:
# 构造模拟数据(替换成你的实际数据) df1 <- data.frame( pathway = c(rep("HALLMARK_ADIPOGENESIS", 6), rep("HALLMARK_INFLAMMATORY_RESPONSE", 3)), _B1_7486 = rnorm(9) ) df2 <- data.frame( pathway = c(rep("HALLMARK_ADIPOGENESIS", 4), rep("HALLMARK_INFLAMMATORY_RESPONSE", 5)), _B1_7534 = rnorm(9) ) # 添加组内行号 df1$row_id <- ave(rep(1, nrow(df1)), df1$pathway, FUN = seq_along) df2$row_id <- ave(rep(1, nrow(df2)), df2$pathway, FUN = seq_along) # 左连接合并 combined_df <- merge(df1, df2, by = c("pathway", "row_id"), all.x = TRUE) combined_df$row_id <- NULL # 删除临时列
效果说明:
两种方法都会让HALLMARK_ADIPOGENESIS保留6行,前4行的_B1_7534列有df2对应的值,后2行填充NA;HALLMARK_INFLAMMATORY_RESPONSE保留3行,全部有_B1_7486的值,_B1_7534列则取df2的前3行对应值,完全符合你的需求。
内容的提问来源于stack exchange,提问作者mike ropri
相关产品推荐
相关产品推荐

