【问题标题】:Find duplicated rows with original查找与原始重复的行
【发布时间】:2014-12-29 11:46:44
【问题描述】:

我可以在data.table dt 上使用R 获得重复的行

dt[duplicated(dt, by=someColumns)] 

但是,我想获得成对的重复行和“非重复行”,例如考虑dt

col1, col2, col3 
   A     B    C1
   A     B    C2
   A    B1    C1

现在,dt[duplicated(dt, by=c('col1', "col2")) 会给我一些类似的东西

col1, col2, col3
   A     B    C2

我想把它和它没有选择复制的行放在一起,即

col1, col2, col3 
   A     B    C1
   A     B    C2

答案的速度比较:

> system.time(dt[duplicated(dt2, by = t) | duplicated(dt, by = t, fromLast = TRUE)])
   user  system elapsed 
  0.008   0.000   0.009 
> system.time(dt[, .SD[.N > 1], by = t])
   user  system elapsed 
 77.555   0.100  77.703 

【问题讨论】:

  • 这个by 参数从何而来?我在?duplicated 的帮助页面中没有看到任何by 参数。你使用的是包中的duplicated(),而不是base
  • @Chase dtdata.table,我忘了说。
  • 同样的逻辑适用,只是更新了我的答案以反映 data.table 实现。

标签: r data.table


【解决方案1】:

我相信这本质上是 this 问题的重复,尽管我可以看到您可能没有找到它...

...这是一个基于引用问题中概述的逻辑的答案:

dt <- read.table(text = "col1 col2 col3 
   A     B    C1
   A     B    C2
   A    B1    C1", header = TRUE, stringsAsFactors = FALSE)


idx <- duplicated(dt[, 1:2]) | duplicated(dt[, 1:2], fromLast = TRUE)

dt[idx, ]
#---
  col1 col2 col3
1    A    B   C1
2    A    B   C2

由于您使用的是data.table,这可能就是您想要的:

library(data.table)
dt <- data.table(dt)
dt[duplicated(dt, by = c("col1", "col2")) | duplicated(dt, by = c("col1", "col2"), fromLast = TRUE)]
#---
   col1 col2 col3
1:    A    B   C1
2:    A    B   C2

【讨论】:

  • 使用data.table 的代码,我只得到输出:col1 col2 col3 1:A B C2。我认为这是因为data.tableduplicate 函数不知道fromLast
  • @FooBar - 我猜你的 data.table 已经过时了,1.9.4 版显然支持fromLast 参数:rdocumentation.org/packages/data.table/functions/duplicated
  • 确实如此。我对此感到害怕,但我的版本是 '1.9.2' 并且 'update.packages()' 不会更新它,显然认为它是最新的。
【解决方案2】:

您只需使用.N即可轻松实现此目的:

dt[, .SD[.N > 1], by = list(col1, col2)]
##    col1 col2 col3
## 1:    A    B   C1
## 2:    A    B   C2

编辑:

您也可以尝试使用非常高效的二分查找,虽然看起来duplicated 仍然更高效

setkey(dt[, indx := .N, by = list(col1, col2)], indx)[!J(1)]
##    col1 col2 col3
## 1:    A    B   C1
## 2:    A    B   C2

【讨论】:

  • 就公式而言,这个答案“更好”。但是,嵌套逻辑使其8500 比我的data.table 的其他解决方案慢几倍。
  • 我添加了一个更快的二进制搜索解决方案,但我同意duplicated 非常有效。虽然我真的不明白为什么不能只使用谷歌。蔡斯(正如他自己提到的)刚刚从here 那里得到了答案
猜你喜欢
  • 2017-04-03
  • 2020-11-16
  • 1970-01-01
  • 2021-06-22
  • 2019-08-08
  • 1970-01-01
  • 1970-01-01
  • 2015-08-12
  • 1970-01-01
相关资源
最近更新 更多