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

在R中按pathway列合并频次不同的两个数据框

R语言按pathway列合并数据框并保留高频次行数的解决方案

你的需求核心是避免普通合并带来的笛卡尔积,同时保留频次更高的数据框的行数,给缺失匹配的行填充NA。可以通过给每个pathway的重复行添加组内序号,再基于pathway和序号进行精确匹配来实现。

方法一:使用dplyr包(推荐,语法直观)

步骤:

  1. 为两个数据框按pathway分组,添加组内行号,用于区分同一路径的不同重复行
  2. 以df1为基础做左连接,匹配条件为pathway和组内行号
  3. 移除临时添加的行号列

代码示例:

# 加载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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 12:12:40