현업 통계/데이터그로스 부서에서 R을 실전으로 사용하다 보면, 분석 코딩 자체보다 외부 플랫폼이나 마크다운 렌더러에서 무작위로 던져주는 다양하고 지저분한 인코딩의 파일들(CSV, 엑셀 xlsx, TSV 등)을 에러 없이 시스템 메모리에 제대로만 불러오는 것이 체감상 분석의 절반 이상만큼 험난하게 느껴지곤 합니다.
엑셀 프로그램에서는 더블 클릭 한 번이면 자동으로 보정되어 열리던 파일들이, R 스튜디오 터미널에서는 한글 인코딩 깨짐 문제(Mac vs Windows), 알 수 없는 쉼표로 인한 밀림, 첫 줄 제목 인식 문제로 치명적 에러를 뿜어냅니다. 이런 고질적인 스트레스를 빠르고 완벽한 파싱 속도로 한 방에 해결해 주는 tidyverse 생태계의 데이터 패칭 쌍두마차, readr와 readxl 패키지 필수 사용법을 정리합니다.
1. 모든 데이터의 가장 범용적인 기본은 CSV 부터: read_csv()
콤마(,)로 분리되어 있는 전 세계 호환용 가장 가벼운 플랫 텍스트 데이터 포맷 파일, 즉 CSV(Comma-Separated Values) 형식을 매우 빠르게 터미널로 불러오는 규격 표준 함수입니다. (베이스의 read.csv()에 비해 로딩 속도가 10배 이상 빠릅니다!)
library(readr)
# 가장 기본적인 쾌속 로딩 형태 (현재 워킹 디렉토리 기준)
my_data <- read_csv("./data/my_file.csv")
> Rows: 15420 Columns: 5
> ── Column specification ───────────────────────────
> Delimiter: ","
> chr (2): user_id, order_status
> dbl (3): age, total_paid, point_used
>
> ℹ Use `spec()` to retrieve the full column specification for this data.
> ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
로딩되는 순간 엔진이 전체 1만 줄 이상을 0.01초 단위로 스캔하여 각 첫 열의 데이터 타입을 자동 유추(chr 문자인지 dbl 숫자인지)하여 명세서 가이드 박스를 친절하게 띄워줍니다.
지옥의 한글 깨짐 (외계어 발생) 방어 방법: locale 옵션
만약 파일 안의 한글이 "뛟꿿홢" 외계어 형태로 모조리 깨져 보인다면, 윈도우 OS에서 작성된 인코딩 문제(CP949)가 맥/리눅스로 넘어오며 충돌했기 때문입니다. 이럴 때는 아래와 같이 locale 옵션을 직접 틀어막아 명시해줍니다.
# UTF-8이나 EUC-KR / CP949 중 하나로 맞추면 마법처럼 한글이 돌아옵니다.
my_data <- read_csv("./data/my_file.csv",
locale = locale(encoding = "CP949"))
2. 탭(Tab)이나 기타 괴상한 기호로 벌어진 텍스트 파일 불러오기: read_delim()
가급적이면 마주치고 싶지 않지만 크롤링 로그 데이터에서 가끔 컬럼 사이 데이터들이 콤마(,)가 아니라 탭(Tab) 키 여백으로 넓게 스페이스가 벌려져 있는 파일(확장명: TSV, TXT 등)을 다운로드 받을 때가 있습니다. 만약 이를 csv로 부르면 컬럼 구분이 안되어 하나의 통짜 문장으로 합쳐 붕괴되어 버립니다.
# 파일 포맷이 tsv(Tab-Separated Values) 형태이고,
# 심지어 데이터 첫 번째 줄이 영단어 변수이름(Header)이 아닌 관측치 데이터값부터 냅다 시작되는 악성 형태인 경우!
my_data_tsv <- read_delim("./data/my_log_file.tsv",
col_names = FALSE, # "헤더 제목줄이 없으니 X1, X2 식으로 네가 달아라" 무시 옵션
delim = "\t") # 컬럼을 나누는 도끼 기준은 특수 탭키 표식(\t) 임을 선언!
> Rows: 580 Columns: 3
> ── Column specification ───────────────────────────
> Delimiter: "\t"
> ...
3. 대망의 진짜 무거운 엑셀 원본 파일(.xlsx) 불러오기: read_excel()
텍스트인 CSV가 아닌, 진성 마이크로소프트 엑셀 원형 파일 구조 포맷(.xlsx, .xls)은 내부적으로 엄청 복잡한 압축 바이너리 문서이므로 별도의 전문 디코딩 모듈인 readxl 패키지가 종속적으로 필요합니다. 이 패키지의 가장 압도적으로 유용한 장점은 원본 파일을 열지 않고도 엑셀 특유의 멀티 하단 탭 시트(Tabs Sheet) 선택과 불러올 행/열 범위의 조각 지정 타겟팅이 자유자재로 메모리상에서 가능하다는 것입니다.
# 주의: tidyverse 코어에 포함되지 않아 별도 로드 필요
# install.packages("readxl")
library(readxl)
excel_data <- read_excel(
path = "./data/my_excel_file.xlsx",
sheet = "sales_sheet", # 엑셀 파일 밑에 깔린 여러 탭 중 하필 이 이름의 탭 시트만 타겟!
skip = 2, # 맨 위 상단에 병합된 쓸데없는 임원진 보고용 타이틀/설명 2줄 강제 건너뛰기!
range = cell_cols("C:F")# 엑셀의 "A, B"열은 개인정보니 버리고 딱 C열 시작부터 F열까지만 쏙! 뽑아오기!
)
head(excel_data, 2)
> # A tibble: 2 × 4
> 주문일 제품명 단가 수량
> <dttm> <chr> <dbl> <dbl>
> 1 2023-11-01 노트북 1500 1
> 2 2023-11-01 무선마우스 50 3
진성 엑셀 파일을 다루실 때 분석가분들이 실무에서 겪는 가장 흔한 에러 및 주의해야 할 점은 read_excel()은 정수(Integer)와 소수점 실수(Double)를 엄격히 구분하지 않고 거의 모든 숫자열을 무자비하게 통째로 소수점 체계인 numeric (dbl) 타입으로 읽어들인다는 점(예: 아이디값이 `1.0` 으로 표시됨)입니다. 따라서 불러오기가 모두 끝난 뒤 mutate() 함수 등으로 문자나 정수형 스키마 캐스팅을 후처리 하셔야 합니다. 이 방어막 데이터 세팅만 마무리되었다면 이제 dplyr 파이프라인을 사용해 마음껏 데이터를 요리할 완벽한 준비가 모두 끝났습니다!
당신이 좋아할 만한 콘텐츠
by Google Adsense