使用dplyr在大数据集中查找重复行的高性能方法

3

I have the following data frame:

> df1 <- data.frame("valA" = c(1,1,1,1,2,1,3,3,3), "valB" = c(1,2,3,1,2,3,1,2,3), "Score" = c(100,90,80,100, 60,80,10,20,30))
> df1
  valA valB Score
1    1    1   100
2    1    2    90
3    1    3    80
4    1    1   100
5    2    2    60
6    1    3    80
7    3    1    10
8    3    2    20
9    3    3    30

我希望您能够得到复制的值(期望结果是):
     valA  valB Score
 1     1     1   100
 2     1     3    80
 3     1     1   100
 4     1     3    80

我知道在dplyr::distinct中有代码可以获取唯一值,但我需要知道哪些行是重复的,而不是将重复的从数据框中删除。我尝试过使用R基础的duplicated函数,但由于我的数据量很大(超过2000万行),它的速度太慢了。我还尝试过:

duplicated_df1 <- df1 %>% group_by(valA, valB, Score) %>% filter(n() > 1)

可以得到上述期望的结果,但是速度太慢了且我没有足够的RAM。请问有什么高效快捷的方法来查找重复行吗?


你尝试过简单地使用 duplicated(df1) 吗? - talat
重复的只会返回“真正”的重复项。 - Andre Elrico
这个?df1[duplicated(df1) | duplicated(df1, fromLast = T), ] 或者 df1 %>% filter(duplicated(df1) | duplicated(df1,fromLast = T)) - Roman
请看这里 - Sotos
那么您可能应该尝试使用data.table:library(data.table); setDT(df1, key = c("valA", "valB", "Score")); df1[, N := .N, by = key(df1)]; df1[N > 1] - talat
显示剩余4条评论
1个回答

0
对于相对较大的数据集,尝试使用data.table方法通常是有用的。在这种情况下,您可以使用以下方法查找重复行:
library(data.table)
setDT(df1, key = c("valA", "valB", "Score"))
df1[, N := .N, by = key(df1)]                # count rows per group
df1[N > 1]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接