2024-09-01

R 배우기 - Dedup! 데이터프레임 중복제거

어떤 테이블이건 분석을 할 때 가장 처음 시작은 dedup부터라고 생각합니다. 테이블들을 join하다 보면 어떤 이유로건 중복된 행이 생길 수가 있는데, 중복을 확인하는 과정을 거치지 않고 분석을 해봤자 틀린 분석이 나올 수 밖에 없어요.

R 데이터프레임에서 중복된 행을 제거하는 방법을 알아보겠습니다.

우선 중복이 있는 간단한 데이터프레임을 만들어봅니다.

> df <- data.frame(name=c('Alice', 'Brian', 'Chris', 'Brian'), age=c(10, 20, 30, 20), height=c(5.2, 5.7, 6, 5.7))
> df
   name age height
1 Alice  10    5.2
2 Brian  20    5.7
3 Chris  30    6.0
4 Brian  20    5.7

2번과 4번 행(row)이 중복되어있죠. 이를 제거하기 위해서, 다음의 세 가지 방법을 사용할 수 있습니다.

(1) duplicated 이용 

어떤 열이 중복된 row 인지는 duplicate() 함수를 써서 알 수 있습니다. R의 base함수이기 때문에 별도의 package설치할 필요 없이 바로 사용할 수 있습니다.

> duplicated(df)
[1] FALSE FALSE FALSE  TRUE

4번째 row가 중복되었음(TRUE)을 보여줍니다. 따라서, 중복되지 않은 row는 !(not)을 이용해서 아래와 같이 찾아낼 수 있습니다.

> !duplicated(df)
[1]  TRUE  TRUE  TRUE FALSE

이 결과를 index로 해서 slicing하면 중복되지 않은 행만 선택이 됩니다.

> df[!duplicated(df),]
   name age height
1 Alice  10    5.2
2 Brian  20    5.7
3 Chris  30    6.0


(2) unique 이용

unique()함수는 중복을 없엔 결과를 리턴합니다. unique()역시 R의 base함수이므로, 별도의 설치 없이 바로 사용할 수 있습니다.

> unique(df)
   name age height
1 Alice  10    5.2
2 Brian  20    5.7
3 Chris  30    6.0

이와 같이 중복된 행을 제거하고 unique한 행만 보여줍니다.


(3) dplyr의 distinct()이용

dplyr 팩키지를 설치하고 distinct()함수를 사용하여도 unique()와 같은 결과를 얻을 수 있습니다.

> dplyr::distinct(df)
   name age height
1 Alice  10    5.2
2 Brian  20    5.7
3 Chris  30    6.0

참고로, tidyverse스타일의 파이프를 사용하면 이렇게도 쓸 수 있습니다.

> df %>% distinct()
   name age height
1 Alice  10    5.2
2 Brian  20    5.7
3 Chris  30    6.0

쉽죠? 중요한 점은 잊지말고 dedup!