2016-02-01 270 views
3

我有一个数据表这样删除重复

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

我其实不明白你想通过重复标识的规则。为什么你想保持行1和行4时,他们是相同的? –

+0

我想保留他们,因为他们有相同的日期。 – pauljeba

+0

@pauljeba您能否澄清一下您想要为具有相同日期但不同v1/v2值的行做什么?例如,对于dt < - data.table(date = c('d1','d2','d3','d1','d2','d3','d4'), 'd''),v1 = c('a','a','b','a','b','b','a','b'),v2 = c(2,2, 4,2,4,4,1,2))? – Cath

回答

6

如果我“翻译”正确,你需要要么不重复的变量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 

正如mentionned由@行阿伦,另一优选的方式,以避免使得dt副本,是采取的duplicated.data.tableby参数的优点:

dt[!duplicated(dt, by=c("v1", "v2")) | 
    (duplicated(dt, by=c("v1", "v2")) & duplicated(dt, by=c("date", "v1", "v2")))] 
+0

即使你拿了你的一票,也可以加一个。 – akrun

+0

感谢@akrun,我只是怀疑你的解决方案做的是什么:它保留了好的重复,这是肯定的,但(除非我失去了一些东西),未能保留不重复的值,在同一日期。 (你可以看看我发布在Q下的评论) – Cath

+1

我明白你的关注。举一个简单的例子,知道OP的期望并不容易。当我们说话时,这个问题有另一种解释(虽然它得到了一个加号) – akrun

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更需要更清晰的方向。

+1

谢谢@Jaap,你的解决方案也可以。 – pauljeba