iBetter Books
수정

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()는 각 파일을 읽어서 행 방향으로 결합합니다. 같은 열 구조를 가진 월별 파일이나 지역별 파일을 합칠 때 유용합니다.

데이터를 불러왔으면, 이제 원하는 부분만 골라내는 방법을 배울 차례입니다.