어떤 테이블이건 분석을 할 때 가장 처음 시작은 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!