R语言duplicated()函数错误输出非重复条目问题排查求解
异常原因
- 对比范围理解错误:你是先对完整的
all_trip表执行duplicated()全表扫描,再对筛选出的重复结果切片查看。被标记的C24A条目的重复项存在于全表的其他位置,和你截取的1365-1370区间内的D81条目无关,你误以为二者被判定为重复,属于对比范围选错了。而且你输出的重复结果里没有D81条目,本身也说明二者没有被判定为重复。 - 判定字段不符合预期:你当前传入
duplicated()的判定字段仅包含车型、起止站点、经纬度、用户类型共8个字段,没有加入started_at、ended_at两个骑行时间字段,只要8个字段相同,不管骑行时间是否一致都会被判定为重复,是不符合你预期逻辑的核心原因。 duplicated()默认规则限制:该函数默认仅标记重复组中非首次出现的条目,不会返回重复组里的第一条记录,所以你只能看到C24A这条重复项,看不到和它匹配的更早出现的另一条重复记录。
解决方法
调整重复判定规则(最常用)
如果你的业务逻辑是「起止时间+其他属性都相同才算重复」,把两个时间字段加入判定列表即可:
# 定义重复判定的全部字段 dup_cols <- c("started_at", "ended_at", "rideable_type", "start_station_name", "end_station_name", "start_lat", "start_lng", "end_lat", "end_lng", "member_casual") # 筛选重复条目(默认返回非首次出现的重复项) same_times_and_place <- all_trip[duplicated(all_trip[dup_cols]), ]
提取重复组的全部条目
如果需要把每个重复组里所有条目都提取出来(含首次出现的),使用双向判定:
dup_flag <- duplicated(all_trip[dup_cols]) | duplicated(all_trip[dup_cols], fromLast = TRUE) all_dup_rows <- all_trip[dup_flag, ]
避免经纬度浮点精度干扰
经纬度为浮点型数值,存储时可能存在微小精度误差导致本应重复的条目没被识别,可以先保留固定小数位(6位对应米级精度,满足骑行场景需求)再判定:
library(dplyr) all_trip <- all_trip %>% mutate(across(c(start_lat, start_lng, end_lat, end_lng), ~round(.x, 6)))
内容的提问来源于stack exchange,提问作者Eddy
相关产品推荐
相关产品推荐

