상황에 따라 중복된 데이터가 존재하여 유일한 행을 반환해야 하는 경우가 있습니다.
▼ 왼쪽의 테이블에는 a=3, b=10 인 행이 두 개 존재합니다. a=2, b=20 인 행도 두 개가 있습니다. 이때 중복된 데이터를 하나의 행으로 반환할 수 있도록 오른쪽 테이블과 같이 만들어보겠습니다.
먼저 다음 코드를 실행하여 위와 같은 데이터를 만듭니다.
> test <- data.frame(a=c(1,2,3,3,3,2,2,1),
b=c(10,10,10,10,20,20,20,30))
> test
a b
1 1 10
2 2 10
3 3 10
4 3 10
5 3 20
6 2 20
7 2 20
8 1 30
중복을 제거하고 유일한 행을 반환하는 방법 세 가지를 알아보겠습니다.
1. duplicated 함수
duplicated 함수는 중복된 요소를 탐색하여 논리적 형태의 벡터로 반환합니다. 다음 예를 확인해보겠습니다. duplicated 함수의 결과값은 TRUE 또는 FALSE 로 반환합니다. 결과값을 보면 네번째와 일곱번째 위치에 TRUE로 나왔습니다. 이는 위 데이터에서 중복된 데이터를 의미합니다. 중복데이터는 TRUE로 반환하고 그 외에는 FALSE를 반환합니다.
> duplicated(test)
[1] FALSE FALSE FALSE TRUE FALSE FALSE TRUE FALSE
TRUE에 해당하는 데이터를 추출하기 위해 대괄호를 이용하여 추출합니다. 아래 코드를 실행하면 중복된 행이 있는 데이터를 반환합니다.
> test[duplicated(test),]
a b
4 3 10
7 2 20
중복하지 않는 유일한 행을 추출해야하기 때문에 위 코드에서 부정을 의미하는 ! 를 함수 앞에 붙여줍니다. 그러면 아래와 같이 중복된 데이터를 제거한 유일한 행을 반환합니다. duplicated 함수의 결과값은 논리형태의 벡터로 나오기 때문에 실제 결과값을 보기 위해선 인덱싱을 해주어야 합니다.
> test[!duplicated(test),]
a b
1 1 10
2 2 10
3 3 10
5 3 20
6 2 20
8 1 30
2. unique 함수
unique 함수는 duplicated 함수와 비슷하지만 그 결과값의 형태가 다릅니다. 바로 결과값을 내보내기 때문에 별도의 인덱싱하는 과정이 필요 없습니다.
> unique(test)
a b
1 1 10
2 2 10
3 3 10
5 3 20
6 2 20
8 1 30
3. distinct 함수
distinct 함수는 dplyr에 속해있는 함수로서 unique 함수와 같은 역할을 합니다. 이 함수를 사용하기 위해선 먼저 dplyr패키지가 설치되어 있어야 합니다.
> # dplyr패키지가 설치되어 있지 않을 시에는 install.packages("dplyr")실행
> library(dplyr)
> distinct(test)
a b
1 1 10
2 2 10
3 3 10
4 3 20
5 2 20
6 1 30
unique함수와 distinct함수는 같은 역할을 하지만 그 수행속도는 distinct함수가 더 빠르다고 알려져 있습니다. system.time() 함수는 코드를 수행한 시간을 알 수 있는 함수입니다. 각 열에 백 만개의 난수를 발생시켜 유일한 행을 반환해보도록 하겠습니다. 끝 줄에 있는 elapsed time을 보면 distinct 함수는 약 74초, unique함수는 201초가 걸렸다는 것을 의미합니다.
> test2 <- data.frame(a=rnorm(10000000),b=rnorm(1000000))
> system.time(distinct(test2))
사용자 시스템 elapsed
35.04 2.08 74.22
> system.time(unique(test2))
사용자 시스템 elapsed
66.50 31.62 201.00
'데이터 분석 > R 데이터 처리 & 분석' 카테고리의 다른 글
R 작업디렉토리/저장경로 지정하는 방법(setwd, getwd) (0) | 2020.06.14 |
---|---|
R 결측치 처리하기(is.na, complete.cases 등) (0) | 2020.06.13 |
[R데이터분석] dplyr 패키지를 활용한 데이터전처리(3)(arrange,mutate) (0) | 2020.02.07 |
[R데이터분석] dplyr 패키지를 활용한 데이터전처리(2) (group_by, summarise) (0) | 2020.01.31 |
[R데이터분석] dplyr 패키지를 활용한 데이터전처리(1) (0) | 2020.01.29 |