R数据框去重保留首行+基于ID合并数据框保证行唯一
嘿,这两个问题都是数据处理里的高频需求,我来给你分享几个实用的解决方案:
问题1:在R的dataframe中删除重复行并保留首行
这事儿我平时用两种方法最多,看你习惯用base R还是tidyverse工具链:
Base R 原生方法:
用duplicated()函数就行,它会返回一个逻辑向量,标记出除了首次出现之外的重复行。我们取这个向量的反值,就能筛选出只保留首行的无重复数据框:# 针对整行重复的情况 df_clean <- df[!duplicated(df), ] # 如果只需要按某一列(比如ID)判断重复,就指定列名 df_clean <- df[!duplicated(df$ID), ]Tidyverse 方法(推荐,代码更易读):
用dplyr包的distinct()函数,默认就会保留首次出现的行,加上.keep_all = TRUE还能保留所有列的信息:library(dplyr) # 整行去重,保留首行 df_clean <- df %>% distinct(.keep_all = TRUE) # 按指定列(比如ID)去重,保留首行的完整数据 df_clean <- df %>% distinct(ID, .keep_all = TRUE)
问题2:合并DF1和DF2为New_Data,基于ID列保证每行唯一
这里得分两种常见场景,先明确你的需求是哪种:
场景1:把两个数据框的行合并到一起,最终每个ID只出现一次
也就是先把DF1和DF2的所有行堆叠起来,再基于ID去重保留首行,用这两种方法:
Tidyverse 简洁版:
library(dplyr) # 先合并所有行,再按ID去重保留首行 New_Data <- bind_rows(DF1, DF2) %>% distinct(ID, .keep_all = TRUE)Base R 原生版:
# 先合并行 combined_df <- rbind(DF1, DF2) # 基于ID去重,保留首行 New_Data <- combined_df[!duplicated(combined_df$ID), ]
场景2:按ID列进行列合并(把两个数据框的列整合,匹配相同ID)
这种情况需要先确保每个数据框自身的ID是唯一的,再合并,避免出现重复ID的行:
# 先分别对DF1和DF2按ID去重(保留首行) DF1_unique <- DF1[!duplicated(DF1$ID), ] DF2_unique <- DF2[!duplicated(DF2$ID), ] # 合并数据框,all=TRUE会保留所有ID(不管在哪个数据框里),你可以根据需求换成all.x或all.y New_Data <- merge(DF1_unique, DF2_unique, by = "ID", all = TRUE)
内容的提问来源于stack exchange,提问作者Rahul shah
相关产品推荐
相关产品推荐

