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

