2012-08-03 2 views
55

나는 약 255 만 개의 행을 가진 data.table 테이블이 있습니다. 두 개의 열이 있습니다. 두 열 모두에서 복제 된 행을 제거하고 싶습니다. 이전에는 data.frame에서 이렇게했을 것입니다 : df -> unique(df[,c('V1', 'V2')]) 그러나 이것은 data.table에서 작동하지 않습니다. unique(df[,c(V1,V2), with=FALSE]) 시도했지만 여전히 경우에만 키를 data.table 및 전체 행을 작동하는 것 같다.data.table에서 중복/비 고유 행 필터링

제안 사항?

건배 데비 V2 테이블 키 행만 -4,7-이고, (10)이 제거 될 수있는 상기 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 

.

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

는 [.N은 = (V1, V2)에 의해.] [1 : 2]' – Akki

답변

61

?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 

모든 열 열쇠를 재설정 한 후 unique 전화 : 마태 복음에서

setkey(dt) 
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 

편집 :

또는 대신 여러 행과 열의 개수의 큰 테이블에 시간이 걸릴 수 있습니다 모든 컬럼에 대한 키를 설정하는 키를 제거하면 동일한 결과를 얻을 수 : data.table 귀하의 예제와

setkey(dt,NULL) 
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 
+0

만이 작업은 어떠한 키가 설정되어 있지 않은 경우. 위의 질문을 명확하게하기 위해 편집 할 것입니다. 죄송합니다. –

+0

@DavyKavanagh 답변 됨 편집 됨 – Andrie

+0

우수. 고맙습니다! –

1

unique(df)이 예에 해당됩니다.

5

을 ... 당신이 키를 설정 필요없이, 그의 unique()을 다음 테이블의 열을 나열 할 수 있습니다, 그래서

> 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 

:

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

는 다음 테스트를 고려 @Andrie (및 @MatthewDowle에 의해 편집 됨)의 솔루션에서 요구하는대로 모든 열 또는 삭제 (NULL으로 설정). @Pop과 @Rahul이 제안한 해결책은 저에게 효과적이지 않았습니다.

아래의 3 번 시도를 참조하십시오. 초기 시도와 매우 유사합니다. 귀하의 사례가 명확하지 않아서 왜 효과가 없었는지 잘 모르겠습니다. 몇 달 전 질문을 올렸을 때 data.table이 업데이트 되었습니까? 고유 DT '을 사용하지 않고

> 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 
+2

아마도 새로운'unique (..., use.key = FALSE)'인자가 도움이 될 것입니다; 현재 [FR # 2483] (https://r-forge.r-project.org/tracker/index.php?func=detail&aid=2483&group_id=240&atid=978)로 제출됩니다. –

+0

안녕하세요 @MatthewDowle. 그렇습니다, 그것은 좋은 편의 일 것입니다. 나는 FR에 귀하의 의견도 올바른 것 같아요 - 키가 고유 한 경우 다음'use.key = FALSE' 무시할 수 있습니다. – dnlbrky

+1

data.table 1.9.6 (이전 버전에는 의심의 여지가 없음)에는 키를 무시하는 데 사용할 수있는'by = '옵션이 있습니다. 'by = NULL'을 설정하면 모든 컬럼을 사용하고 비슷한 data.frame 메소드와 같은 역할을합니다. " – JWilliman