개요
R이 언어라면 Tidyverse는 미국말. 사실상 표준이라고 봐도 무방하다. 그간 숨쉬듯 Tidyverse를 써왔다. 그러나 국민건강정보DB는 용량이 너무 크고 자료가 방대하여 결국 Fastverse(특히 data.table)로의 이주가 필수적이었다.
두 장점을 각각 섞은 tidytable 패키지가 있긴 한데, 이건 논외로 하자.
.csv 파일 읽어오기
.fst 파일이 속도와 효율면에서는 압도적이긴 한데, 우선 가장 범용적인 .csv부터 다뤄보기로 했다. fst는 fst 패키지만의 전용 확장자라 일단은 익숙한 형태부터 시작했다.
basename()은 긴 파일 경로에서 디렉토리 부분은 떼어내고, 오직 파일명(또는 가장 하위 폴더명)만 추출할 때 사용한다. 이걸 활용해서 lapply()로 가져온 data_list 리스트에 이름을 붙여주자.
이중 2008-2012년 상병내역 T40을 하나로 합쳐 저장하자:
- base 함수로 `rbind()``가 있고,
- dplyr 함수로
bind_rows()가 있지만, - data.table 함수
rbindlist()를 사용하자.
각각 장단점이 있지만, rbindlist()가 수십배 빠르고 메모리효율도 압도적이다. use.names 옵션으로 같은 열끼리 맞춰주고, fill 옵션으로 혹 빈컬럼이 있다면 NA로 채워주자.
idcol이라는 옵션을 켜면 합쳐진 데이터셋에 “source”라는 컬럼이 생기고, 셀값으로 t40_2022 등 리스트 이름이 자동으로 채워진다. 유용한 기능이지만 실무에선 용량과 효율 문제로 사용하지 않을 것 같다.
잘 합쳐졌다. 기대 이상으로 속도도 매우 빨라서 쾌감이 있었다.
KEY_SEQ SEQ_NO RECU_FR_DT DSBJT_CD SICK_SYM
<i64> <int> <int> <int> <char>
1: 200800000148 1 20081222 1 J303
2: 200800000148 2 20081222 1 J060
3: 200800000149 1 20081229 1 J060
4: 200800000149 2 20081229 1 J303
5: 200800000329 1 20081224 11 J219
---
1571230: 201227849358 1 20120309 3 F410
1571231: 201227849358 2 20120309 3 F510
1571232: 201227849917 1 20121026 1 B370
1571233: 201227849917 2 20121026 1 K291
1571234: 201227849917 3 20121026 14 L509
특정 조건에 맞는 행 제거하기
dplyr의 직관적인 문법에 익숙해져 있다보니 방법은 무궁무진하게 떠올랐지만, 국민건강정보DB 분석에서는 어떻게든 코드의 효율(메모리)을 최우선으로 고려해야 했다.
먼저 제외조건을 기록한 데이터를 만들어보자. 최종 목표는 앞서 만든 2008-2012년 상병내역 자료에서 2008년에 당뇨, 고혈압으로 진료받은 기록이 있는 환자를 제외하는 것. 여기서는 주상병, 부상병만 확인하자.
이제 제외할 사람들의 목록(ID)을 만들자.
PERSON_ID
<int>
1: 66536499
2: 65507926
3: 15707162
4: 68569103
5: 50583213
---
225: 80692240
226: 33295034
227: 64399261
228: 71009305
229: 70543918
남은 일은 다음과 같다:
- 전체기간 T20에서 PERSON_ID와 KEY_SEQ만 불러온뒤,
- 위의 PERSON_ID에 해당하는 행을 제거한뒤,
- 여기에 T40을 left join 하는 것
잘 됐나 확인해보자. 참고로 T40의 전체 행수는 1571234.
PERSON_ID KEY_SEQ SEQ_NO RECU_FR_DT DSBJT_CD SICK_SYM
<int> <i64> <int> <int> <int> <char>
1: 89450360 200800000148 1 20081222 1 J303
2: 89450360 200800000148 2 20081222 1 J060
3: 89450360 200800000149 1 20081229 1 J060
4: 89450360 200800000149 2 20081229 1 J303
5: 74148596 200800000329 1 20081224 11 J219
---
1456471: 19747621 201227849358 1 20120309 3 F410
1456472: 19747621 201227849358 2 20120309 3 F510
1456473: 12739949 201227849917 1 20121026 1 B370
1456474: 12739949 201227849917 2 20121026 1 K291
1456475: 12739949 201227849917 3 20121026 14 L509