在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的结果为:
| A | B | C |
|---|---|---|
| 10 | English | Civil |
| 60 | English | Common |
| 90 | English | Common |
方案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
相关产品推荐
相关产品推荐

