根据常见值和不同值删除重复项

时间:2016-02-01 11:54:25

标签: r duplicates data.table

我有一个像这样的数据表

dt <- data.table(date=c('d1','d2','d3','d1','d2','d3'),v1=c('a','a','b','a','b','b'),v2=c(2,2,4,2,4,4))
   date v1 v2
1:   d1  a  2
2:   d2  a  2 <-need to remove this 
3:   d3  b  4 
4:   d1  a  2
5:   d2  b  4 <-need to remove this 
6:   d3  b  4

我的实际数据包含1600万行和5列构成唯一条件,以及一个日期列。我想删除具有相同公共值的重复项(在v1,v2中),但仅限于它们的日期(日期)不同。

示例输出

   date v1 v2
1:   d1  a  2
2:   d3  b  4
3:   d1  a  2
4:   d3  b  4

我尝试了“重复”功能但无法找到删除重复项的正确方法。感谢任何帮助。

2 个答案:

答案 0 :(得分:8)

如果我正确“翻译”,您需要不为变量v1v2复制的行,或者为这些变量复制的行,还需要变量date

dt[!duplicated(dt[, .(v1, v2)]) | 
   (duplicated(dt[, .(v1, v2)]) & duplicated(dt[, .(date, v1, v2)]))]
#   date v1 v2
#1:   d1  a  2
#2:   d3  b  4
#3:   d1  a  2
#4:   d3  b  4

正如@Arun所提到的,另一种避免复制dt的方法是利用by的{​​{1}}参数:

duplicated.data.table

答案 1 :(得分:4)

我理解这个问题的方法是,对于每个v1 / v2组合,只需要保留出现次数最多的日期。为此,你可以做到:

dt[, n:=.N, by = .(date,v1,v2)][, .SD[n==max(n)], by = .(v1,v2)][, n:= NULL][]

给出:

   v1 v2 date
1:  a  2   d1
2:  a  2   d1
3:  b  4   d3
4:  b  4   d3

使用提供的示例数据,它提供与@Cath和@Akrun相同的结果。

但是,使用以下数据(@Cath在问题的评论中发布):

dt1 <- data.table(date=c('d1','d2','d3','d1','d2','d3','d4','d4'), 
                  v1=c('a','a','b','a','b','b','a','b'),
                  v2=c(2,2,4,2,4,4,1,2))

现在@ akrun的方法会给出不同的结果:

> dt1[!duplicated(dt1[, .(v1, v2)]) | (duplicated(dt1[, .(v1, v2)]) & duplicated(dt1[, .(date, v1, v2)])), ]
   date v1 v2
1:   d1  a  2
2:   d3  b  4
3:   d1  a  2
4:   d3  b  4
5:   d4  a  1
6:   d4  b  2
> dt1[, if(uniqueN(.SD, by = c('v1', 'v2'))==1) .SD ,by = date]
   date v1 v2
1:   d1  a  2
2:   d1  a  2
3:   d3  b  4
4:   d3  b  4
> dt1[, n:=.N, by = .(date,v1,v2)][, .SD[n==max(n)], by = .(v1,v2)][, n:= NULL][]
   v1 v2 date
1:  a  2   d1
2:  a  2   d1
3:  b  4   d3
4:  b  4   d3
5:  a  1   d4
6:  b  2   d4

因此欢迎对OP所希望的更明确的方向。