2016-02-01 172 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