كتابة البيانات بتنسيقات متعددة
صدّر إطارات البيانات إلى 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 إلى 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-8write_tsv(df, 'file.tsv')— إخراج مفصول بعلامات الجدولةwrite_delim(df, file, delim='|')— استخدام أي محدِّدsaveRDS(obj, 'file.rds')— تنسيق R ثنائي يحافظ على جميع الأنواعreadRDS('file.rds')— الاستعادة بأي اسم؛ وload()— الاستعادة بالأسماء الأصليةwritexl::write_xlsx()— إخراج Excel دون الحاجة إلى Javaarrow::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 يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- قراءة ملفات CSV باستخدام read_csv()
- تحليل ملفات TSV وذات العرض الثابت
- استيراد ملفات Excel باستخدام readxl
- كتابة البيانات بتنسيقات متعددة