使用重复项或非重复项删除不成功的重复项

Remove duplicates unsuccessful using duplicated or distinct

提问人:cliu 提问时间:6/17/2023 更新时间:6/17/2023 访问量:29

问:

我似乎很难使用中的 or 函数删除重复项。我不知道问题出在哪里,但谁能帮忙?以下是一小部分数据作为示例:duplicateddistinctdplyr

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
r dplyr 复制 数据操作 清理

评论

1赞 Melissa Key 6/17/2023
您的时间戳并不相同,因此它们都是不同的。
2赞 Brian 6/17/2023
如果您只需要 1 秒的精度,您可以使用!duplicated(round(timestamp))
0赞 cliu 6/17/2023
@MelissaKey你是对的,因为返回 false,但只是通过查看它们是相同的。那么我们怎么知道呢?df$timestamp[1]==df$timestamp[2]
1赞 Melissa Key 6/17/2023
我可以通过查看您示例中的小数来判断。显然,对于大型数据集,您不会这样做,但每当您处理数值数据时,这通常是一个很好的起点。四舍五入(如@Brian所建议的)是一个很好的解决方法,如果它是原因并且你不需要这种级别的准确性

答:

1赞 TarJae 6/17/2023 #1

该问题是由于浮点精度造成的。 时间戳仅复制到小数点的某个点。

解决此问题的一种方法是四舍五入,然后应用或:filter()distinct()

df %>%
  mutate(timestamp1 = round(timestamp, 0)) %>% 
  filter(!duplicated(timestamp1)) %>% 
  select(-timestamp1)

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