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
'Development Tip' 카테고리의 다른 글
getaddrinfo : nodename 또는 servname이 제공되었거나 알려지지 않음 (0) | 2020.11.08 |
---|---|
변수가 앞에 오는 Python for-in 루프 (0) | 2020.11.08 |
ES6 맵을 JSON.stringify하는 방법은 무엇입니까? (0) | 2020.11.08 |
WebView처럼 Windows Form에 Gecko 또는 Webkit을 임베드 할 수 있습니까? (0) | 2020.11.08 |
C ++ : 두 벡터 비교 (0) | 2020.11.08 |