Чтение CSV-файлов

Реальные данные приходят файлами. Учимся загружать CSV в R и превращать их в data.frame.

CSV (comma-separated values) — текстовый формат таблицы, где значения разделены запятыми, а строки — переносами.

CSV — самый распространённый формат обмена данными: его понимают Excel, базы данных, веб-сервисы, государственные порталы открытых данных. В R одна команда превращает CSV-файл в полноценный data.frame, готовый к анализу.

Почему CSV так популярен? Он предельно простой — это обычный текст, который откроет любой редактор и любая программа на любой платформе. Никаких закрытых форматов, версий и привязки к конкретному ПО: файл, выгруженный из системы десятилетней давности, прочитается и сегодня. Эта универсальность делает CSV «общим языком» данных. Поэтому умение надёжно загружать CSV — точка входа почти в любой реальный проект: данные приходят файлом, и первый шаг анализа — корректно затащить их в R.

Как выглядит CSV

Внутри файл — простой текст: первая строка обычно заголовки, дальше данные.

name,age,city
Аня,25,Москва
Борис,30,Казань
Вера,22,Москва

Базовое чтение: read.csv

Встроенная функция read.csv читает файл и возвращает таблицу:

df <- read.csv("people.csv")
head(df)

Аргумент header = TRUE (по умолчанию) говорит, что первая строка — заголовки. Если разделитель не запятая, а точка с запятой (частый случай в русской локали Excel), используют read.csv2 или указывают sep = ";".

Современный способ: read_csv

Из пакета readr (часть tidyverse) функция read_csv быстрее и аккуратнее: она сама определяет типы колонок и не превращает строки в факторы.

library(readr)
df <- read_csv("people.csv")

Различие практичное: read_csv печатает, какие типы определил для каждой колонки, и реже преподносит сюрпризы с кодировкой и факторами.

Сохранение результата

Обратная операция — запись таблицы в файл:

write.csv(df, "result.csv", row.names = FALSE)

Аргумент row.names = FALSE убирает лишний столбец с номерами строк, который иначе R добавит в файл.

Как работает под капотом

При чтении R разбирает каждую строку по разделителю и пытается угадать тип колонки: если все значения похожи на числа — делает numeric, иначе оставляет текст. Поэтому колонка с пропусками, записанными как "N/A" или "-", неожиданно станет текстовой. Чтобы R понял такие метки как пропуски, ему передают na = c("", "NA", "N/A"). Кодировка — ещё одна частая засада: русский текст из Windows-файла иногда требует encoding = "UTF-8" или "CP1251".

Частые ошибки

  • Неверный разделитель. Если Excel сохранил с ;, а вы читаете read.csv, всё попадёт в одну колонку. Берите read.csv2 или sep=";".
  • Кракозябры в кириллице. Укажите правильную кодировку при чтении.
  • Относительный путь. Файл ищется относительно рабочей директории. Проверяйте её через getwd().

Итог

  • CSV — текстовая таблица со значениями через разделитель.
  • read.csv — базовое чтение, read.csv2/sep=";" — для точки с запятой.
  • readr::read_csv — быстрее, удобнее, точнее с типами.
  • Следите за кодировкой и пометками пропусков.
Проверьте себя
1. Что такое CSV?
AБинарный формат R
BТекстовая таблица со значениями через разделитель
CФормат изображений
DТип данных в R
2. Какую функцию использовать, если Excel сохранил CSV с разделителем «точка с запятой»?
Aread.csv с настройками по умолчанию
Bread.csv2 или read.csv с sep = ";"
Cread.table без аргументов
Dload()
3. Зачем при write.csv указывают row.names = FALSE?
AЧтобы ускорить запись
BЧтобы не добавлять лишний столбец с номерами строк
CЧтобы сохранить только заголовки
DЭто обязательный аргумент