Ch2. 중복데이터 제거하기 및 데이터 프레임 정렬
흔하지는 않지만, 중복으로 입력되는 데이터 셋을 마주치는 일이 생기기 마련입니다. 보통 중복데이터는 데이터 수집단계에서 많이 발생합니다. 하지만 이를 하나하나 엑셀로 처리하는 것은 한계가 있기때문에, R에서 처리하는 방법에 대해 다루어 보고자 합니다.
- 1차원 벡터, 리스트에서의 중복 제거
A = rep(1:10, each = 2) # 1 ~ 10까지 2번씩 반복
print(A)
## [1] 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10
# 중복 제거
unique(A)
## [1] 1 2 3 4 5 6 7 8 9 10
데이터 프레임에서의 중복 제거
다음과 같은 데이터 프레임을 예시로 삼겠습니다.
변수 설명
- OBS : 번호
- NAME : 환자 이름
- ID : 환자 고유번호
- DATE : 검사 날짜
- BTW : Body total water
먼저, 환자 이름이 있고, 그 환자의 고유 ID가 있습니다. 세상에 동명이인은 많기 때문에 항상 고유 ID를 기록해둡니다.
# 데이터 불러오기
DUPLICATE = read.csv("C:/R/DUPLICATED.csv")
DUPLICATE
## OBS NAME ID DATE BTW
## 1 1 A A10153 2018-11-30 1
## 2 2 A A10153 2018-11-30 3
## 3 3 B B15432 2018-11-30 4
## 4 4 A A15853 2018-11-29 5
## 5 5 C C54652 2018-11-28 5
## 6 6 C C54652 2018-11-27 6
## 7 7 D D14568 2018-11-28 7
## 8 8 D D17865 2018-11-27 3
## 9 9 E E13254 2018-11-26 2
## 10 10 E E13254 2018-11-25 3
- 전체 중복 제거
DUPLICATED3_1 = DUPLICATE[-which(duplicated(DUPLICATE)),]
DUPLICATED3_1
## [1] OBS NAME ID DATE BTW
## <0 rows> (or 0-length row.names)
하나라도 중복이 되면 다 지워버립니다. 별로 추천드리지는 않습니다.
- 변수 한개를 기준으로 중복 제거
# NAME이 같은 변수들 중복 제거
DUPLICATED3_2 = DUPLICATE[-which(duplicated(DUPLICATE$NAME)),]
DUPLICATED3_2
## OBS NAME ID DATE BTW
## 1 1 A A10153 2018-11-30 1
## 3 3 B B15432 2018-11-30 4
## 5 5 C C54652 2018-11-28 5
## 7 7 D D14568 2018-11-28 7
## 9 9 E E13254 2018-11-26 2
여기서 주목해야 될 부분은 중복값은 제거를 하고 하나만 남기게 되는데, 그 기준은 Row 번호가 빠른, 즉 위에 있는 행을 남기고 뒤에 있는 데이터 값들을 삭제 시킵니다.
- 다변수를 기준으로 중복 제거
#NAME, ID 두 개의 값이 같은 중복 데이터 제거
DUPLICATED3_3 = DUPLICATE[!duplicated(DUPLICATE[,c('NAME','ID')]),] # 변수명으로 제거
DUPLICATED3_3
## OBS NAME ID DATE BTW
## 1 1 A A10153 2018-11-30 1
## 3 3 B B15432 2018-11-30 4
## 4 4 A A15853 2018-11-29 5
## 5 5 C C54652 2018-11-28 5
## 7 7 D D14568 2018-11-28 7
## 8 8 D D17865 2018-11-27 3
## 9 9 E E13254 2018-11-26 2
DUPLICATED3_4 = DUPLICATE[!duplicated(DUPLICATE[,c(2,3)]),] # 인덱스로 제거
DUPLICATED3_3
## OBS NAME ID DATE BTW
## 1 1 A A10153 2018-11-30 1
## 3 3 B B15432 2018-11-30 4
## 4 4 A A15853 2018-11-29 5
## 5 5 C C54652 2018-11-28 5
## 7 7 D D14568 2018-11-28 7
## 8 8 D D17865 2018-11-27 3
## 9 9 E E13254 2018-11-26 2
가끔 병원에서는 동일 환자가 같은 검사를 날짜를 다르게 중복해서 받는 경우가 있습니다. 물론 어떤 값을 남겨야 할지는 상황마다 다르겠지만, 지금은 '마지막 검사 기준 데이터'를 남기는 것으로 진행하도록 하겠습니다.
중복 제거는 맨 처음값만 남기기 때문에, 최근 검사 데이터가 맨 위로 올라오도록 정렬(sort)을 해주어야 합니다.
- 데이터 정렬 하기
# 날짜 변수 설정하기
DUPLICATE$DATE = as.Date(DUPLICATE$DATE,"%Y-%m-%d")
summary(DUPLICATE$DATE)
## Min. 1st Qu. Median Mean 3rd Qu.
## "2018-11-25" "2018-11-27" "2018-11-28" "2018-11-28" "2018-11-29"
## Max.
## "2018-11-30"
날짜 변수를 날짜형식으로 바꾸는 명령어는 as.Date, as.Posixct가 있습니다. 보통 '년-월-일'로 구성되어 있으면 as.Date를 사용하고 '년-월-일 시:분:초'로 구성되어 있으면 as.Posixct를 쓰게 됩니다. 지금은 '년-월-일'이기 때문에 as.Date를 사용하도록 하겠습니다.
# DATE변수 기준으로 정렬
DUPLICATE_SORT = DUPLICATE[order(DUPLICATE[,'DATE'],decreasing = TRUE), ]
decreasing 옵션은 오름차순 혹은 내림차순으로 할 것인지 정의해주는 것입니다. decreasing = TRUE은 내림차순으로 진행한다는 의미입니다.
중복제거는 위에서 진행했던 것처럼 진행하면 되겠습니다.