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

在R中对data frame去重时,如何指定保留特定重复行?

解决R语言Data Frame中按指定条件删除重复行的问题

首先修正你示例代码里的小错误:变量定义用了大写A/B/C,但创建data.frame时用了小写a/b/c,正确代码应该是:

A <- c(10, 10, 60, 90)
B <- c("French", "English", "English", "English")
C <- c("Civil", "Civil", "Common", "Common")

df <- data.frame(A, B, C)

你的需求是:当A列值重复时,保留B列为"English"的行,删除"French"的行;无重复的行则全部保留。下面提供两种可行方案:

方案1:使用dplyr包(更直观易读)

如果还没安装dplyr,先执行安装命令:

install.packages("dplyr")

然后按分组筛选:

library(dplyr)

df_clean <- df %>%
  group_by(A) %>%
  filter(B == "English" | n() == 1) %>%
  ungroup()
  • group_by(A):按A列的值分组
  • filter(B == "English" | n() == 1):筛选出每组中B为"English"的行,或者组内只有一行(无重复)的行
  • ungroup():取消分组,恢复普通data.frame结构

运行后df_clean的结果为:

ABC
10EnglishCivil
60EnglishCommon
90EnglishCommon

方案2:使用Base R(无需额外包)

先给数据排序,把B列为"English"的行放到每个A组的前面,再用duplicated保留每组的第一行:

# 先排序:按A分组,B列中"English"优先排在前面
df_sorted <- df[order(df$A, -match(df$B, "English")), ]
# 保留每个A的第一行(此时第一行是English)
df_clean <- df_sorted[!duplicated(df_sorted$A), ]
  • order(df$A, -match(df$B, "English")):先按A排序,再让B为"English"的行排在同组最前面
  • !duplicated(df_sorted$A):只保留每个A第一次出现的行,也就是排序后的English行

为什么你的原代码不行?

你用的df[!duplicated(df$A), ]会保留A列第一次出现的行,而你的示例中"French"行在"English"行前面,所以会错误保留"French"行。上面的方案通过优先排序或条件筛选,确保保留你需要的行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 17:35:03