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

如何在R中为重复数据框匹配唯一子集的对应行名?

在R中为重复数据框匹配对应唯一行名的简便方法

我有一个带有唯一行名但包含大量重复记录的数据框df,已通过代码提取出唯一子集df1和重复项df2。现在需要为df2添加一列,用于查询其在df1中对应的重复伙伴行名,期望得到指定格式的结果,请问在R中有没有简便的实现方法?

原始数据构建代码

df = read.table(text="ID    S1  S2  S3  S4  S5  S6  S7  S8  S9
Chr01A_7164 A   A   A   A   A   A   A   A   H
Chr01A_7230 A   A   A   A   A   A   A   A   H
Chr01A_7444 A   A   A   A   A   A   A   A   H
Chr01A_14994    A   A   H   A   A   A   A   A   A
Chr01A_59238    A   A   A   A   A   A   A   A   A
Chr01A_61882    A   H   A   A   A   H   A   A   A
Chr01A_66693    A   A   A   A   A   A   A   A   A
Chr01A_66741    A   A   A   A   B   A   A   A   A
Chr01A_66776    A   A   A   A   B   A   A   A   A
Chr01A_67014    A   A   A   A   B   A   A   A   A
Chr01A_67096    A   A   A   A   B   A   A   A   A", header=T, stringsAsFactors=F)
df <- data.frame(df, row.names = 1)

提取唯一子集与重复项的代码

df1 <- df[!duplicated(df),]
df2 <- df[duplicated(df),]

期望结果

S1 S2 S3 S4 S5 S6 S7 S8 S9 duplicated_df1
Chr01A_7230   A  A  A  A  A  A  A  A  H   Chr01A_7164
Chr01A_7444   A  A  A  A  A  A  A  A  H   Chr01A_7164
Chr01A_66693  A  A  A  A  A  A  A  A  A   Chr01A_59238
Chr01A_66776  A  A  A  A  B  A  A  A  A   Chr01A_66741
Chr01A_67014  A  A  A  A  B  A  A  A  A   Chr01A_66741
Chr01A_67096  A  A  A  A  B  A  A  A  A   Chr01A_66741

实现方法

方法1:基础R原生实现

利用match函数将df的每一行匹配到df1中的对应行,再提取该行的行名作为匹配结果:

# 为原始数据框添加对应唯一行名的列
df$duplicated_df1 <- rownames(df)[match(df, df1, nomatch = 0)]
# 提取df2对应的结果
result_df2 <- df[rownames(df2), ]

方法2:dplyr分组实现

如果习惯使用tidyverse工具链,可通过分组后提取每组首次出现的行名:

library(dplyr)

# 分组后为每组添加首次出现的行名
df_with_match <- df %>%
  group_by(across(everything())) %>%
  mutate(duplicated_df1 = first(rownames(.))) %>%
  ungroup()

# 提取df2对应的结果
result_df2 <- df_with_match[rownames(df2), ]

两种方法都能得到符合期望的结果,其中基础R方法无需额外安装包,适合轻量场景;dplyr方法逻辑更直观,适合复杂数据处理流程。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 12:51:00