我理解问题的方式是,对于每个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