본문 바로가기
R

[R.아르] 중복된 행 삭제하기 unique() / duplicated()

by LightBlogger 2016. 9. 12.

R에서 중복된 행을 삭제하려면 unique()를 사용하면 된다.


다음과 같은 x에서



unique()를 실행시키면



중복된 행들이 사라지는 것을 알 수 있다.



중복된 행이 몇 개나 되는지 숫자가 알고 싶을 때는?


지난 번에 본 nrow를 쓰면 되겠다.



여러 개의 열이 있을 경우에는


행의 모든 값이 완전히 동일할 때만 중복으로 간주한다. 


예를들어 다음과 같은 x에서



unique()를 실행시키면



4행과 5행은 서로 중복이 아니므로 제거되지 않는다.



간혹 중복된 행들을 직접 눈으로 확인하고 싶을 때가 있다.


이럴 땐 duplicated() 함수를 사용한다.


다음과 같은 x에서



duplicated()를 사용하면 중복된 행을 TRUE로, 아닌 행을 FALSE로 반환해 준다.



진리값이 보기 어렵다면 which()안에 넣어 보자.



3행과 6행이 TRUE, 중복이므로


다음과 같이 해당 행들을 출력하면 된다.



물론 which()는 우리의 편의를 위해 넣은 것이므로


생략해도 결과는 동일하다.


FALSE인 행은 생략하고 TRUE인 행만 출력하게 된다.


하지만 실제로 중복은 1행과 3행, 그리고 2행과 6행인데


1, 2행이 빠져 있어 잘 와닿지 않는다.


중복된 최초의 행까지 포함하려면


x[which(duplicated(x) | duplicated(x, fromLast=T) ),]


와 같이 duplicated()를 한 번 더 적용해 주면 된다.



원리를 알아보자.


duplicated()의 [fromLast=] 옵션은 말 그대로 끝에서부터 중복 여부를 검사하라는 의미다.


즉 다음과 같은 x에서



옵션 없는 duplicated()는 1행에서 아래로 내려가며 다음과 같이 동작한다.



1행의 a1이 중복인가? FALSE


2행의 c3이 중복인가? FALSE


3행의 a1이 중복인가? TRUE


...



반면 [fromLast=T]의 옵션이 주어진 duplicated()는 7행에서 위로 올라오며 다음과 같이 동작한다.



7행의 d4가 중복인가? FALSE <- 값 자체는 7번째에 쓰인다.


6행의 c3가 중복인가? FALSE <- 값은 6번째에 쓰인다.


...


2행의 c3가 중복인가? TRUE <- 값은 2번째에 쓰인다.


1행의 a1이 중복인가? TRUE <- 값은 1번째에 쓰인다.



그러므로 이 둘의 결과를 or("|")를 이용하여 합하면 중복된 행을 모두 볼 수 있다.


x[which( duplicated(x) | duplicated(x, fromLast=T) ) ,]



행의 순서는 2016/09/26 - [R] - [R.아르] 원하는 순서로 데이터 정렬하기 order() 에서 나온


order() 를 이용하여 바꾸어도 되겠다.



행이 셋 이상 다수 중복되어


중복된 회수를 파악하는 것이 중요하다면


plyr 라이브러리의 count()라는 함수를 사용하는 것이 유용하다.



특정 열의 값만 파악할 수도 있다.



중복된 행만 보려면 subset()을 이용하자.







반응형

댓글