使用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
相关产品推荐
相关产品推荐

