0Pricing
R Academy · 课时

将数据写入多种格式

使用 write_csv() 和 writexl 将数据框导出为 CSV、Excel 和 RDS

将数据写入多种格式 是 CoddyKit 上的免费 R Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 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'))

使用 writexl 输出 Excel

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!')

使用 arrow 处理 Parquet 文件

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 到 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')

快速检查

与使用 write_csv() 保存 R 数据相比,使用 saveRDS() 的主要优势是什么?

回顾:写出数据

从 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

常见问题解答

「将数据写入多种格式」课时是免费的吗?

是的 — 「将数据写入多种格式」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 R Academy 课程的其余内容,请升级到 CoddyKit PRO。 R Academy 课程共包含 4 节课。

「将数据写入多种格式」这节课中我会学到什么?

使用 write_csv() 和 writexl 将数据框导出为 CSV、Excel 和 RDS 你通过在浏览器中直接运行的动手代码来练习 R Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 R Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 R Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。

「将数据写入多种格式」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 R Academy 课中编写并运行代码吗?

能。每节 R Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 使用 read_csv() 读取 CSV 文件
  2. 解析 TSV 与定宽文件
  3. 使用 readxl 导入 Excel 文件
  4. 将数据写入多种格式
← 返回 R Academy