R语言 过滤掉data.table中的重复/非唯一行

qzlgjiam  于 2023-05-04  发布在  其他
关注(0)|答案(5)|浏览(166)

**编辑2019:***此问题是在2016年11月data.table更改之前提出的,请参阅下面的当前和以前方法的可接受答案。

我有一个data.table表,大约有250万行。有两列。我想删除两列中重复的所有行。以前对于data.frame,我会这样做:df -> unique(df[,c('V1', 'V2')]),但这对data.table不起作用。我试过unique(df[,c(V1,V2), with=FALSE]),但它似乎仍然只对data.table的键进行操作,而不是整行。
有什么建议吗?
干杯,戴维
示例

>dt
      V1   V2
[1,]  A    B
[2,]  A    C
[3,]  A    D
[4,]  A    B
[5,]  B    A
[6,]  C    D
[7,]  C    D
[8,]  E    F
[9,]  G    G
[10,] A    B

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

dt <- data.table::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"),
)
yvfmudvl

yvfmudvl1#

v1.9.8+released November 2016

From ?unique.data.table默认情况下使用所有列(与?unique.data.frame一致)

unique(dt)
   V1 V2
1:  A  B
2:  A  C
3:  A  D
4:  B  A
5:  C  D
6:  E  F
7:  G  G

或者使用by参数来获得特定列的唯一组合(就像以前使用的键一样)。

unique(dt, by = "V2")
   V1 V2
1:  A  B
2:  A  C
3:  A  D
4:  B  A
5:  E  F
6:  G  G

1.9.8之前版本

?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,]  B  A
[2,]  A  B
[3,]  A  C
[4,]  A  D
[5,]  E  F
[6,]  G  G
1qczuiv0

1qczuiv02#

使用您的示例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)

考虑以下测试:

> 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(),而不需要根据@Andrie的解决方案(由@MatthewDowle编辑)的要求将键设置为所有列或删除它(通过将其设置为NULL)。@Pop和@Rahul提出的解决方案对我不起作用。
请参阅下面的第3次尝试,这与您最初的尝试非常相似。你的例子不清楚,所以我不知道为什么它不起作用。另外,几个月前你发布了这个问题,所以也许data.table已经更新了?

> unique(dt) # Try 1: wrong answer (missing V1=C and V2=D)
   V1 V2
1:  B  A
2:  A  B
3:  A  C
4:  A  D
5:  E  F
6:  G  G

> dt[!duplicated(dt)] # Try 2: wrong answer (missing V1=C and V2=D)
   V1 V2
1:  B  A
2:  A  B
3:  A  C
4:  A  D
5:  E  F
6:  G  G

> unique(dt[,list(V1,V2)]) # Try 3: correct answer; does not require modifying key
   V1 V2
1:  B  A
2:  A  B
3:  A  C
4:  A  D
5:  C  D
6:  E  F
7:  G  G

> setkey(dt,NULL)
> unique(dt) # Try 4: correct answer; requires key to be removed
   V1 V2
1:  B  A
2:  A  B
3:  A  C
4:  A  D
5:  C  D
6:  E  F
7:  G  G
vxqlmq5t

vxqlmq5t3#

unique(df)可以在您的示例中工作。

jc3wubiy

jc3wubiy4#

这个应该对你有用

dt <- unique(dt, by = c('V1', 'V2'))
k2arahey

k2arahey5#

保存数据。可以使用的表格表示法:

unique(df[, .(V1, V2, V3), nomatch=0 ])

https://stackoverflow.com/a/31875208/10087503
我还没有比较这个与岩浆的版本的速度。

相关问题