使用原始查找重复的行

时间:2014-11-02 20:04:08

标签: r data.table

我可以使用

R data.table dt上获得重复的行
dt[duplicated(dt, by=someColumns)] 

但是,我想获得一对重复的行和#34;非重复的",例如考虑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 

2 个答案:

答案 0 :(得分:2)

我认为这基本上是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

答案 1 :(得分: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