0Pricing
R Academy · Урок

Запись данных в разных форматах

Экспортируйте таблицы данных в CSV, Excel и RDS с помощью write_csv() и writexl.

«Запись данных в разных форматах» — бесплатный урок R Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения R Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс R Academy содержит 4 уроков всего.

Запись данных из R

Чтение данных — это только половина задачи: необходимо также сохранять результаты. R поддерживает несколько форматов вывода: CSV для универсальной совместимости, RDS для точного сохранения объектов R, Parquet для высокопроизводительной аналитики и другие. Выбирайте формат с учётом аудитории и задачи.

library(readr)

# Create a sample data frame to write
df <- data.frame(
  name = c('Alice','Bob','Carol'),
  score = c(85.5, 92.0, 78.3),
  grade = c('B','A','C'),
  passed = c(TRUE, TRUE, TRUE)
)

print(df)
cat('\nWe will save this in multiple formats!')

write_csv() — сохранение в формате CSV

write_csv(df, 'file.csv') сохраняет таблицу данных в файл с разделителями-запятыми. По умолчанию имена строк НЕ записываются (в отличие от write.csv()). Результат всегда кодируется в UTF-8. Функция незаметно возвращает таблицу данных, поэтому её можно использовать в конвейерах.

library(readr)

df <- data.frame(
  name = c('Alice','Bob','Carol'),
  score = c(85, 92, 78)
)

# Write to /tmp for demonstration
write_csv(df, '/tmp/students.csv')

# Verify by reading back
read_csv('/tmp/students.csv', show_col_types=FALSE)

Параметры write_csv()

write_csv() принимает несколько параметров: na='NA' управляет записью значений NA, append=TRUE добавляет данные в существующий файл, col_names=FALSE исключает заголовок, а quote определяет, когда заключать поля в кавычки.

library(readr)

df <- data.frame(
  name = c('Alice','Bob'),
  city = c('New York','Los,Angeles'),  # Contains comma
  score = c(85, NA)
)

# na='' writes NA as empty string (common Excel convention)
write_csv(df, '/tmp/test_write.csv', na='')
cat(paste(read_lines('/tmp/test_write.csv'), collapse='\n'))

write_tsv() — вывод с разделителями-табуляциями

write_tsv(df, 'file.tsv') сохраняет данные с разделителями-табуляциями. Этот формат предпочтителен, если данные содержат запятые или если последующая система ожидает TSV. Параметры те же, что и у write_csv().

library(readr)

df <- data.frame(
  address = c('123 Main St, NYC','456 Oak Ave, LA'),
  score = c(85, 92)
)

# TSV avoids delimiter conflict with commas in addresses
write_tsv(df, '/tmp/addresses.tsv')
cat(paste(read_lines('/tmp/addresses.tsv'), collapse='\n'))

saveRDS() — сохранение любого объекта R

saveRDS(obj, 'file.rds') сериализует любой объект R на диске во встроенном двоичном формате R. readRDS('file.rds') точно восстанавливает его, сохраняя типы столбцов, факторы, атрибуты и даже объекты моделей. Формат неудобен для чтения человеком, но полностью переносим между сеансами R.

library(readr)

df <- data.frame(
  name = c('Alice','Bob'),
  score = c(85.5, 92.0),
  grade = factor(c('B','A'), levels=c('A','B','C','D'))
)

# Save with full type preservation
saveRDS(df, '/tmp/students.rds')

# Restore exactly
df2 <- readRDS('/tmp/students.rds')
print(df2)
print(class(df2$grade))  # factor — preserved!

saveRDS() и save() — ключевое различие

saveRDS(obj, 'file.rds') сохраняет один объект без его имени. С помощью readRDS() ему можно присвоить любое имя. save(obj1, obj2, 'file.RData') сохраняет несколько именованных объектов, а load() восстанавливает их с исходными именами (при этом существующие переменные могут быть перезаписаны).

# saveRDS: single object, flexible on load
model <- lm(mpg ~ wt, data=mtcars)
saveRDS(model, '/tmp/my_model.rds')
best_model <- readRDS('/tmp/my_model.rds')  # Any name!
cat('R-squared:', round(summary(best_model)$r.squared, 3), '\n')

# save: multiple named objects, fixed names on load
# save(model, mtcars, file='/tmp/workspace.RData')
# load('/tmp/workspace.RData')  # Restores 'model' and 'mtcars'

write_delim() — пользовательский разделитель

write_delim(df, file, delim='|') записывает данные с любым разделителем. Используйте эту функцию, если последующая система ожидает формат с разделителями-вертикальными чертами или другой нестандартный формат. Те же гарантии качества данных, что и для write_csv(), применяются и здесь.

library(readr)

df <- data.frame(
  id = 1:3,
  name = c('Alice','Bob','Carol'),
  value = c(100, 200, 150)
)

# Write pipe-delimited
write_delim(df, '/tmp/data.psv', delim='|')
cat(paste(read_lines('/tmp/data.psv'), collapse='\n'))

Вывод в Excel с помощью writexl

Пакет writexl (дополнение к readxl) записывает таблицы данных в формат .xlsx: writexl::write_xlsx(df, 'file.xlsx'). Для нескольких листов передайте именованный список. Установка Java или Excel не требуется.

# writexl::write_xlsx() — example (library not always available)
# library(writexl)

df1 <- data.frame(name=c('Alice','Bob'), score=c(85,92))
df2 <- data.frame(region=c('East','West'), sales=c(100,200))

# Single sheet:
# write_xlsx(df1, '/tmp/students.xlsx')

# Multiple sheets (named list):
# write_xlsx(
#   list(students=df1, sales=df2),
#   '/tmp/report.xlsx'
# )

cat('writexl writes pure .xlsx without Java or Excel!')

Файлы Parquet с помощью arrow

Apache Parquet — это столбцовый формат хранения, идеально подходящий для больших наборов данных: он хорошо сжимается и значительно быстрее считывается, чем CSV, при выполнении запросов по столбцам. Пакет arrow предоставляет функции write_parquet() и read_parquet().

# arrow::write_parquet() concept
# library(arrow)

# Large CSV -> Parquet (10-100x smaller, 10-100x faster reads)
# df <- read_csv('big_file.csv')
# write_parquet(df, 'big_file.parquet')
# df_back <- read_parquet('big_file.parquet')

# Parquet benefits:
# - Columnar: only reads columns you need
# - Compressed: ~10x smaller than CSV
# - Typed: no type re-guessing on read
# - Partitioned: split by date/region for parallel reads

cat('Parquet is the modern standard for large-scale analytics in R!')

Запись данных в конвейере

И write_csv(), и saveRDS() незаметно возвращают свои входные данные, поэтому их можно использовать внутри конвейера, не нарушая его поток. Вставляйте этап записи в середину конвейера с помощью контрольной точки write_csv(), чтобы обеспечить воспроизводимость.

library(readr)
library(dplyr)

# Write mid-pipeline as a checkpoint
final_result <- data.frame(
  region=c('East','West','North'),
  sales=c(100,200,80)
) %>%
  mutate(pct = round(100*sales/sum(sales),1)) %>%
  {. ->> checkpoint_df; .} %>%  # Save checkpoint
  filter(sales > 90)

write_csv(checkpoint_df, '/tmp/checkpoint.csv')
print(final_result)

Руководство по выбору формата

Выбор подходящего формата вывода зависит от вашей цели:

  • CSV/TSV: универсальные, удобные для чтения человеком, их может открыть любой пользователь
  • RDS: для обмена между R, точно сохраняет все типы и атрибуты
  • xlsx: для бизнес-пользователей и пользователей Excel
  • Parquet: для больших объёмов данных, аналитических конвейеров и производственных систем
  • JSON: для API и вложенных или иерархических данных (jsonlite::toJSON())
library(readr)

df <- data.frame(
  id = 1:5,
  value = c(10.5, 20.3, 15.7, 30.1, 25.8)
)

# CSV — universal
write_csv(df, '/tmp/data.csv')

# TSV — when commas are in data
write_tsv(df, '/tmp/data.tsv')

# RDS — R-native, type-preserving
saveRDS(df, '/tmp/data.rds')

cat('Files created:\n')
cat('CSV size:', file.size('/tmp/data.csv'), 'bytes\n')
cat('RDS size:', file.size('/tmp/data.rds'), 'bytes\n')

Быстрая проверка

В чём ключевое преимущество saveRDS() перед write_csv() при сохранении данных R?

Итоги: запись данных

Основные выводы о записи данных из R:

  • write_csv(df, 'file.csv') — разделители-запятые, без имён строк, UTF-8
  • write_tsv(df, 'file.tsv') — вывод с разделителями-табуляциями
  • write_delim(df, file, delim='|') — любой разделитель
  • saveRDS(obj, 'file.rds') — двоичный формат R, сохраняет все типы
  • readRDS('file.rds') — восстанавливает под любым именем; load() восстанавливает исходные имена
  • writexl::write_xlsx() — вывод в Excel, Java не требуется
  • arrow::write_parquet() — столбцовый формат для больших аналитических наборов данных
library(readr)

df <- data.frame(
  name = c('Alice','Bob','Carol'),
  score = c(85.5, 92.0, 78.3),
  grade = factor(c('B','A','C'))
)

# CSV: universal but loses factor
write_csv(df, '/tmp/demo.csv')
df_csv <- read_csv('/tmp/demo.csv', show_col_types=FALSE)
cat('CSV grade type:', class(df_csv$grade), '\n')  # character

# RDS: preserves factor
saveRDS(df, '/tmp/demo.rds')
df_rds <- readRDS('/tmp/demo.rds')
cat('RDS grade type:', class(df_rds$grade))  # factor

Часто задаваемые вопросы

Урок «Запись данных в разных форматах» бесплатный?

Да — полный текст урока «Запись данных в разных форматах» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс R Academy, подпишись на CoddyKit PRO. Курс R Academy содержит 4 уроков всего.

Чему я научусь в уроке «Запись данных в разных форматах»?

Экспортируйте таблицы данных в CSV, Excel и RDS с помощью write_csv() и writexl. Ты практикуешь R Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать R Academy?

Предыдущий опыт не требуется. R Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «Запись данных в разных форматах»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке R Academy?

Да. Каждый урок R Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Чтение CSV-файлов с помощью read_csv()
  2. Разбор TSV-файлов и файлов фиксированной ширины
  3. Импорт Excel-файлов с помощью readxl
  4. Запись данных в разных форматах
← Назад к R Academy