在data.table中过滤掉重复/非唯一的行

我有一个约250万行data.table表。 有两列。 我想要删除两列中重复的行。 以前对于data.frame,我会做这个: df -> unique(df[,c('V1', 'V2')])但是这不适用于data.table。 我试过unique(df[,c(V1,V2), with=FALSE])但它似乎仍然只对data.table的键而不是整行进行操作。

有什么build议么?

干杯,戴维

 >dt V1 V2 [1,] AB [2,] AC [3,] AD [4,] AB [5,] BA [6,] CD [7,] CD [8,] EF [9,] GG [10,] AB 

在上面的data.table中, V2是表键,只有行4,7和10将被删除。

 > dput(dt) structure(list(V1 = c("B", "A", "A", "A", "A", "A", "C", "C", "E", "G"), V2 = c("A", "B", "B", "B", "C", "D", "D", "D", "F", "G")), .Names = c("V1", "V2"), row.names = c(NA, -10L), class = c("data.table", "data.frame"), .internal.selfref = <pointer: 0x7fb4c4804578>, sorted = "V2") 

?unique.data.table ,很明显,在数据表上调用unique只能在键上工作。 这意味着您必须在调用unique之前将密钥重置为所有列。

 library(data.table) dt <- data.table( V1=LETTERS[c(1,1,1,1,2,3,3,5,7,1)], V2=LETTERS[c(2,3,4,2,1,4,4,6,7,2)] ) 

调用unique一列作为关键字:

 setkey(dt, "V2") unique(dt) V1 V2 [1,] BA [2,] AB [3,] AC [4,] AD [5,] EF [6,] GG 

将键重置为所有列,然后调用unique

 setkey(dt) unique(dt) V1 V2 [1,] AB [2,] AC [3,] AD [4,] BA [5,] CD [6,] EF [7,] GG 

马修编辑:

或者,而不是将所有列的键设置为可能需要一些时间的多行和多列的大表,则删除键将获得相同的结果:

 setkey(dt,NULL) unique(dt) V1 V2 1: AB 2: AC 3: AD 4: BA 5: CD 6: EF 7: GG 

用你的例子data.table …

 > dt<-data.table(V1 = c("B", "A", "A", "A", "A", "A", "C", "C", "E", "G"), V2 = c("A", "B", "B", "B", "C", "D", "D", "D", "F", "G")) > setkey(dt,V2) 

考虑以下testing:

 > haskey(dt) # obviously dt has a key, since we just set it [1] TRUE > haskey(dt[,list(V1,V2)]) # ... but this is treated like a "new" table, and does not have a key [1] FALSE > haskey(dt[,.SD]) # note that this still has a key [1] TRUE 

所以,你可以列出表的列,然后取其unique() ,而不需要设置所有列的键或将其丢弃(通过设置为NULL ),从@Andrie(和由@MatthewDowle编辑)。 @Pop和@Rahulbuild议的解决scheme并不适合我。

请参阅下面的尝试3,这与您的初始尝试非常相似。 你的例子不清楚,所以我不知道为什么它不工作。 也是几个月前,当你发布的问题,所以也许data.table更新?

 > unique(dt) # Try 1: wrong answer (missing V1=C and V2=D) V1 V2 1: BA 2: AB 3: AC 4: AD 5: EF 6: GG > dt[!duplicated(dt)] # Try 2: wrong answer (missing V1=C and V2=D) V1 V2 1: BA 2: AB 3: AC 4: AD 5: EF 6: GG > unique(dt[,list(V1,V2)]) # Try 3: correct answer; does not require modifying key V1 V2 1: BA 2: AB 3: AC 4: AD 5: CD 6: EF 7: GG > setkey(dt,NULL) > unique(dt) # Try 4: correct answer; requires key to be removed V1 V2 1: BA 2: AB 3: AC 4: AD 5: CD 6: EF 7: GG 

unique(df)适用于你的例子。