Development Tip

data.table에서 중복되거나 고유하지 않은 행 필터링

yourdevel 2020. 11. 8. 11:20
반응형

data.table에서 중복되거나 고유하지 않은 행 필터링


data.table약 250 만 개의 행 이있는 테이블이 있습니다. 두 개의 열이 있습니다. 두 열에서 중복되는 행을 제거하고 싶습니다. 이전에는 df -> unique(df[,c('V1', 'V2')])data.frame에 대해이 작업을 수행했을 것입니다. 그러나 이것은 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 행만 제거됩니다.

> 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")

이전 v1.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

v1.9.8 +의 경우

에서 ?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

예제 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()키를 모든 열에 설정하거나 NULL@Andrie의 솔루션에서 요구하는대로 삭제할 필요없이 (@MatthewDowle에서 편집) 가져올 수 있습니다. ). @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

unique(df) works on your example.


This should work for you

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

참고URL : https://stackoverflow.com/questions/11792527/filtering-out-duplicated-non-unique-rows-in-data-table

반응형