我可以使用
在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
答案 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