我有一个像这样的数据表
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
我尝试了“重复”功能但无法找到删除重复项的正确方法。感谢任何帮助。
答案 0 :(得分:8)
如果我正确“翻译”,您需要不为变量v1
和v2
复制的行,或者为这些变量复制的行,还需要变量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所希望的更明确的方向。