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

使用dplyr的duplicated或distinct函数去重失败求助

dplyr去重失败问题排查与解决

问题描述

使用dplyr包的duplicated或distinct函数去除重复数据时,执行后仍保留重复项,示例数据及操作如下:

示例数据

df <- data.frame(timestamp = c(1495115680.55608, 1495115680.58941, 
                             1495115680.62274), id = c("2017-05-18-145157833880", "2017-05-18-145157833880", 
                                                       "2017-05-18-145157833880"), condition = c("childchild", "childchild", 
                                                                                                 "childchild"))

执行的去重代码及结果

运行以下两段代码均未实现去重:

df %>%
  filter(!duplicated(timestamp))

distinct(df, timestamp, .keep_all = TRUE)

返回结果:

timestamp                      id  condition
1 1495115681 2017-05-18-145157833880 childchild
2 1495115681 2017-05-18-145157833880 childchild
3 1495115681 2017-05-18-145157833880 childchild

原因分析

从返回结果的timestamp列可以看到,原始数据中的三个高精度时间戳被四舍五入显示为1495115681,但实际存储的是1495115680.55608、1495115680.58941、1495115680.62274这三个不同的数值。duplicated和distinct函数是基于数据的实际存储值判断重复的,因此这三条数据不会被判定为重复项,自然无法去重。

解决方法

根据不同的去重需求,可选择以下方案:

需求1:按timestamp的整数部分去重

先对timestamp取整,再执行去重操作:

# 方法1:filter + duplicated
df %>%
  mutate(timestamp_int = floor(timestamp)) %>%
  filter(!duplicated(timestamp_int)) %>%
  select(-timestamp_int)

# 方法2:distinct
df %>%
  mutate(timestamp_int = floor(timestamp)) %>%
  distinct(timestamp_int, .keep_all = TRUE) %>%
  select(-timestamp_int)

需求2:基于id和condition列去重

如果需要保留id和condition相同的唯一行,直接指定这两列为去重依据:

# 方法1:filter + duplicated
df %>%
  filter(!duplicated(across(c(id, condition))))

# 方法2:distinct
df %>%
  distinct(id, condition, .keep_all = TRUE)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 11:12:45