0Pricing
R Academy · บทเรียน

การเขียนข้อมูลในหลายรูปแบบ

ส่งออกดาต้าเฟรมเป็น CSV, Excel และ RDS ด้วย write_csv() และ writexl

การเขียนข้อมูลในหลายรูปแบบ เป็นบทเรียน R Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 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-to-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

คำถามที่พบบ่อย

บทเรียน “การเขียนข้อมูลในหลายรูปแบบ” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การเขียนข้อมูลในหลายรูปแบบ” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส R Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส R Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การเขียนข้อมูลในหลายรูปแบบ”

ส่งออกดาต้าเฟรมเป็น CSV, Excel และ RDS ด้วย write_csv() และ writexl คุณปฏิบัติ R Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 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