【问题标题】:High-performance way to find duplicated rows (using dplyr) on big data set查找重复行(使用 dplyr)
【发布时间】:2017-12-20 09:32:57
【问题描述】:

我有以下数据框:

> 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 base package: duplicated function,但它太慢了,因为我的数据很大(超过 2000 万行)。我也试过了:

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

这可能会导致上述预期结果,但同样,它太慢而且我没有足够的 RAM。 谁能建议我找到重复行的高效快速方法?

【问题讨论】:

  • 你试过简单duplicated(df1)吗?
  • duplicated 只会返回“真正的”重复。
  • 这个? df1[duplicated(df1) | duplicated(df1, fromLast = T), ]df1 %&gt;% filter(duplicated(df1) | duplicated(df1,fromLast = T))
  • 看看this
  • @docendodiscimus 我试过 'df1[duplicated(df1),]' ,它适用于小数据,但我的电脑崩溃了,因为我有超过 2000 万次观察,所以我需要一个更快的代码。跨度>

标签: r duplicates dplyr


【解决方案1】:

对于大型数据,尝试使用 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]

【讨论】:

    猜你喜欢
    • 2015-03-30
    • 1970-01-01
    • 2013-01-06
    • 1970-01-01
    • 2014-05-22
    • 2018-07-06
    • 2017-05-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多