R语言删除数据框col1重复非整行记录 仅保留各分组首行
R按分组保留首行去重的解决方法
原代码错误原因
你写的df %>% group_by(col1) %>% filter(duplicated(col1) | n()!=1)逻辑完全不符合需求:
- 分组后每个组内的col1值完全相同,
duplicated(col1)会返回组内除第一行外的所有行结果为TRUE - 加上
| n()!=1的条件,所有行都会被判定为符合过滤条件,相当于全量保留原数据,自然得不到预期结果。
正确实现方法
1. 最简tidyverse写法(推荐)
直接用distinct()函数,指定按col1去重,同时保留所有列的内容:
library(dplyr) result <- df %>% distinct(col1, .keep_all = TRUE)
参数.keep_all = TRUE会保留首次出现的匹配行的所有列值,输出结果完全匹配你的预期。
2. 分组取首行写法
如果你习惯用分组操作的逻辑,可以用slice()或者行号过滤实现:
# slice写法 result <- df %>% group_by(col1) %>% slice(1) %>% ungroup() # 不需要后续分组操作的话建议加该行去掉分组属性 # 行号过滤写法 result <- df %>% group_by(col1) %>% filter(row_number() == 1) %>% ungroup()
3. 基础R实现
不需要加载任何第三方包,直接用基础函数就能实现:
result <- df[!duplicated(df$col1), ]
内容的提问来源于stack exchange,提问作者blub_9
相关产品推荐
相关产品推荐

