Ch 02. 데이터 읽기와 쓰기 (readr, readxl)
분석은 항상 데이터를 가져오는 것에서 시작합니다. R로 작업할 때 가장 자주 마주치는 형식은 CSV와 Excel입니다. tidyverse는 이 두 가지를 깔끔하게 처리하는 도구를 제공합니다. readr은 CSV를, readxl은 Excel을 담당합니다.
readr로 CSV 읽기
R 기본 함수 read.csv()도 CSV를 읽을 수 있습니다. 그런데 readr의 read_csv()는 몇 가지 이점이 있습니다. 속도가 빠르고, 결과가 tibble이며, 열 유형을 자동으로 추론하고, 한국어 등 다국어 인코딩 처리가 더 유연합니다.
실습을 위해 먼저 CSV 파일을 하나 만들겠습니다.
library(tidyverse)
# 실습용 CSV 파일 생성
write_csv(
tibble(
name = c("Alice", "Bob", "Charlie", "Diana"),
dept = c("영업", "개발", "영업", "인사"),
salary = c(3200, 4500, 2900, 3800),
joined = c("2020-03-01", "2019-07-15", "2021-11-20", "2018-05-10")
),
"employees.csv"
)
이제 이 파일을 읽어옵니다.
emp <- read_csv("employees.csv")
emp
Rows: 4 Columns: 4
── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (3): name, dept, joined
dbl (1): salary
ℹ 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.
# A tibble: 4 × 4
name dept salary joined
<chr> <chr> <dbl> <chr>
1 Alice 영업 3200 2020-03-01
2 Bob 개발 4500 2019-07-15
3 Charlie 영업 2900 2021-11-20
4 Diana 인사 3800 2018-05-10
열 유형이 자동으로 감지되었습니다. joined 열은 날짜처럼 보이지만 문자로 읽혔습니다. 날짜로 읽으려면 col_types를 지정합니다.
emp <- read_csv(
"employees.csv",
col_types = cols(
name = col_character(),
dept = col_character(),
salary = col_double(),
joined = col_date(format = "%Y-%m-%d")
)
)
emp
# A tibble: 4 × 4
name dept salary joined
<chr> <chr> <dbl> <date>
1 Alice 영업 3200 2020-03-01
2 Bob 개발 4500 2019-07-15
3 Charlie 영업 2900 2021-11-20
4 Diana 인사 3800 2018-05-10
joined가 <date> 유형으로 바뀌었습니다. 이제 날짜 계산이 가능합니다.
건너뛰기와 주석 처리
실무 CSV 파일에는 상단에 메모나 불필요한 행이 있는 경우가 많습니다. skip으로 건너뛸 수 있습니다.
# 상단 2행을 건너뛰고 읽기
read_csv("employees.csv", skip = 2)
# #으로 시작하는 행을 주석으로 처리
read_csv("employees.csv", comment = "#")
한국어 인코딩 처리
정부나 공공기관에서 내려받은 CSV 파일은 EUC-KR 인코딩인 경우가 많습니다. 그냥 열면 한글이 깨집니다.
# EUC-KR 파일 읽기
read_csv("euckr_file.csv", locale = locale(encoding = "EUC-KR"))
인코딩을 모를 때는 readr::guess_encoding()으로 추측할 수 있습니다.
guess_encoding("euckr_file.csv")
# A tibble: 2 × 2
encoding confidence
<chr> <dbl>
1 ISO-8859-1 0.40
2 EUC-KR 0.35
readxl로 Excel 읽기
readxl 패키지는 tidyverse를 설치할 때 함께 들어오지만, 자동으로 로드되지는 않습니다. 별도로 불러와야 합니다.
library(readxl)
실습용 Excel 파일이 없다면, openxlsx 패키지로 만들거나 실제 파일을 사용합니다. 기본 사용법은 다음과 같습니다.
# 첫 번째 시트 읽기
sales <- read_excel("sales_data.xlsx")
# 시트 이름으로 지정
sales <- read_excel("sales_data.xlsx", sheet = "2024년")
# 시트 번호로 지정
sales <- read_excel("sales_data.xlsx", sheet = 2)
Excel 파일에 어떤 시트가 있는지 먼저 확인할 수 있습니다.
excel_sheets("sales_data.xlsx")
[1] "2022년" "2023년" "2024년"
특정 범위만 읽기
Excel에서 표가 A1부터 시작하지 않는 경우가 있습니다. range로 셀 범위를 지정합니다.
# B3:F20 범위만 읽기
read_excel("sales_data.xlsx", range = "B3:F20")
# 특정 시트의 범위
read_excel("sales_data.xlsx", sheet = "2024년", range = "A1:D50")
CSV로 저장하기
분석이 끝난 결과를 파일로 저장할 때는 write_csv()를 사용합니다.
# 기본 저장
write_csv(emp, "result.csv")
# NA를 빈 문자열로 저장
write_csv(emp, "result.csv", na = "")
write_csv()는 UTF-8로 저장합니다. Excel에서 열 때 한글이 깨질 수 있습니다. Excel 호환 인코딩으로 저장하려면 write_excel_csv()를 사용합니다.
# Excel 호환 UTF-8 BOM 포함 저장
write_excel_csv(emp, "result_excel.csv")
여러 파일을 한 번에 읽기
같은 형식의 파일이 여러 개 있을 때 한 번에 불러올 수 있습니다.
# 폴더 안의 모든 CSV 파일 목록
files <- list.files("data/", pattern = "\\.csv$", full.names = TRUE)
# 모두 읽어서 하나로 합치기
all_data <- map_dfr(files, read_csv)
map_dfr()는 각 파일을 읽어서 행 방향으로 결합합니다. 같은 열 구조를 가진 월별 파일이나 지역별 파일을 합칠 때 유용합니다.
데이터를 불러왔으면, 이제 원하는 부분만 골라내는 방법을 배울 차례입니다.