我理解問題的方式是,對於每個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和行4時,他們是相同的? –
我想保留他們,因爲他們有相同的日期。 – pauljeba
@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