데이터 분석/R 데이터 처리 & 분석

[데이터처리] 중복 데이터 제거한 데이터프레임 생성(duplicated, unique, distinct)

love R 2020. 5. 17. 04:25
반응형

상황에 따라 중복된 데이터가 존재하여 유일한 행을 반환해야 하는 경우가 있습니다.

 

▼ 왼쪽의 테이블에는 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 
  

 

반응형