استيراد البيانات في R: قراءة ملفات CSV وExcel وSPSS وStata وSAS

⚡ ملخص ذكي

يتناول هذا الدليل كيفية استيراد البيانات في لغة R، بما في ذلك قراءة ملفات CSV باستخدام الدالة read.csv()، وملفات Excel باستخدام الدالة readxl، وملفات SAS أو STATA أو SPSS باستخدام الدالة haven. كما يوضح كيفية تحديد الأوراق والصفوف ونطاقات الخلايا بدقة عند الاستيراد.

  • 📄 استيراد ملف CSV: تقوم الدالة read.csv(file, header = TRUE, sep = “,”) بتحميل ملف مفصول بفواصل من مسار محلي أو URL.
  • ⚠️ تغيير الإصدار: منذ الإصدار R 4.0.0، تظل أعمدة الأحرف أحرفًا، لأن stringsAsFactors الآن يتم تعيينها افتراضيًا إلى FALSE.
  • 📗 استيراد ملفات إكسل: تقوم الدالة read_excel() من الدالة readxl بمعالجة كل من ملفات .xls و .xlsx، وتقوم الدالة excel_sheets() بإدراج كل ورقة عمل أولاً.
  • 🎯 الاختيار الدقيق: تحدد n_max عدد الصفوف، وتأخذ range صيغة Excel، وتأخذ cell_rows() أو cell_cols() الفهارس والأحرف.
  • 🔄 برامج أخرى: توفر Haven الدوال read_sas() و read_dta() و read_sav()، ولا تحتاج كل منها إلا إلى مسار أو URL.
  • 🧹 إدخال نظيف: قم بترميز القيم المفقودة كـ NA وتجنب المسافات أو الرموز في أسماء الأعمدة قبل الاستيراد.

استيراد البيانات في لغة R

يمكن أن توجد البيانات في أشكال مختلفة. لكل تنسيق R لديه وظيفة وحجة محددة. يشرح هذا البرنامج التعليمي كيفية استيراد البيانات إلى R.

قراءة ملفات CSV

يُعدّ تنسيق CSV (قيم مفصولة بفواصل) أكثر تنسيقات البيانات استخدامًا. يقوم برنامج R بتحميل مجموعة من المكتبات عند بدء التشغيل، بما في ذلك حزمة utils. توفر هذه الحزمة الدالة read.csv()، وهي الطريقة القياسية لفتح ملف CSV. إليك صيغة الدالة:

read.csv(file, header = TRUE, sep = ",")

حجة:

  • ملف: PATH حيث يتم تخزين الملف
  • رأس: تأكيد ما إذا كان الملف يحتوي على رأس أم لا، افتراضيًا، يتم تعيين الرأس على TRUE
  • سبتمبر: الرمز المستخدم لتقسيم المتغير. بشكل افتراضي، `،`.

سوف نقرأ اسم ملف البيانات mtcats. يتم تخزين ملف CSV على الإنترنت. إذا تم تخزين ملف ‎.csv محليًا، فيمكنك استبدال PATH داخل مقتطف الشفرة. لا تنس أن تغلفه بالداخل ' '. يجب أن يكون PATH قيمة سلسلة.

بالنسبة لمستخدم ماك، مسار مجلد التنزيل هو:

 "/Users/USERNAME/Downloads/FILENAME.csv"

لمستخدمي الويندوز:

"C:\Users\USERNAME\Downloads\FILENAME.csv"

لاحظ أنه يجب علينا دائمًا تحديد امتداد اسم الملف.

  • . CSV
  • . XLSX
  • .رسالة قصيرة
  • ...
PATH <- 'https://raw.githubusercontent.com/guru99-edu/R-Programming/master/mtcars.csv'                
df <- read.csv(PATH, header =  TRUE, sep = ',')
length(df)

الإخراج:

## [1] 12
class(df$X)

الإخراج:

## [1] "factor"

في إصدارات R السابقة للإصدار 4.0.0، كانت الدالة read.csv() تحوّل كل عمود نصي إلى عامل، ولهذا السبب تُرجع الدالة class(df$X) القيمة "factor" المذكورة أعلاه. يمكنك تعطيل هذه الخاصية باستخدام stringsAsFactors = FALSE.

⚠️ ملاحظة حول الإصدار: منذ R 4.0.0 (G) القيمة الافتراضية هي stringsAsFactors = FALSE، لذا تبقى أعمدة الأحرف من نوع أحرف، ويعيد المثال الأول الآن القيمة "character" في التثبيتات الحديثة. تمرير الوسيط بشكل صريح، كما هو موضح أدناه، يُعطي النتيجة نفسها في جميع الإصدارات، وهو الأسلوب الأمثل.

PATH <- 'https://raw.githubusercontent.com/guru99-edu/R-Programming/master/mtcars.csv'
df <-read.csv(PATH, header =TRUE, sep = ',', stringsAsFactors =FALSE)
class(df$X)

الإخراج:

## [1] "character"

أصبحت فئة المتغير X الآن حرفًا.

دالة read.csv() مقابل دالة read_csv(): أيهما يجب عليك استخدامه؟

تأتي الدالة read.csv() مُدمجة مع لغة R الأساسية ولا تحتاج إلى أي حزمة إضافية. أما حزمة readr فتضيف الدالة read_csv()، وهي أسرع وتتخذ قرارات أقل نيابةً عنك.

المعايير read.csv() (utils) read_csv() (readr)
الحزمة المطلوبة بدون سلوفان اقرأ
سرعة التعامل مع الملفات الكبيرة أبطأ أسرع بعدة مرات
سياسات الإرجاع والاستبدال البيانات تيبل
أسماء الأعمدة تم تحويل المسافات إلى نقاط تم الاحتفاظ بها كما هي مكتوبة تماماً
الكشف عن النوع صامت تم الإبلاغ عنه في مواصفات العمود
library(readr)
df <- read_csv(PATH)

# For very large files, data.table::fread() is faster still
library(data.table)
df <- fread(PATH)

استخدم الدالة read.csv() للملفات الصغيرة والبرامج النصية التي يجب تشغيلها دون الحاجة إلى حزم إضافية. استخدم الدالة read_csv() عندما يكون الملف كبيرًا أو عندما يكون الحفاظ على أسماء الأعمدة بدقة أمرًا بالغ الأهمية.

قراءة ملفات إكسل

Excel تحظى الملفات بشعبية كبيرة بين محللي البيانات. تتميز جداول البيانات بسهولة العمل ومرونتها. تم تجهيز R بمكتبة readxl لاستيراد جداول بيانات Excel.

استخدم هذا الرمز

require(readxl)

للتحقق من تثبيت readxl في جهازك. إذا قمت بتثبيت r مع r-conda-essential، فإن المكتبة مثبتة بالفعل. يجب أن تشاهد في نافذة الأوامر:

الإخراج:

Loading required package: readxl.

إذا لم تكن الحزمة مثبتة، يمكنك تثبيتها باستخدام conda مكتبة أو في المحطة، استخدم conda install -c mittner r-readxl.

استخدم الأمر التالي لتحميل المكتبة لاستيراد ملفات Excel.

library(readxl)

readxl_example()

نستخدم الأمثلة المضمنة في الحزمة readxl خلال هذا البرنامج التعليمي.

استخدام التعليمات البرمجية

readxl_example()

لرؤية جميع جداول البيانات المتوفرة في المكتبة.

Readxl_Example

للتحقق من موقع جدول بيانات معين، مرر اسمه:

readxl_example("geometry.xls")

Readxl_Example

إذا قمت بتثبيت R مع conda، فستكون جداول البيانات موجودة في Anaconda3/lib/R/library/readxl/extdata/filename.xls

read_excel()

تقوم الدالة read_excel() بفتح كل من امتدادات .xls و .xlsx وتختار المحلل المناسب تلقائيًا.

الصيغة هي:

read_excel(PATH, sheet = NULL, range= NULL, col_names = TRUE)
arguments:
-PATH: Path where the excel is located
-sheet: Select the sheet to import. By default, all
-range: Select the range to import. By default, all non-null cells
-col_names: Select the columns to import. By default, all non-null columns

يمكننا استيراد جداول البيانات من مكتبة readxl وإحصاء عدد الأعمدة في الورقة الأولى.

# Store the path of `datasets.xlsx`
example <- readxl_example("datasets.xlsx")
# Import the spreadsheet
df <- read_excel(example)
# Count the number of columns
length(df)

الإخراج:

## [1] 5

أوراق التفوق ()

يتكون ملف datasets.xlsx من 4 أوراق. يمكننا معرفة الأوراق المتوفرة في المصنف باستخدام وظيفة excel_sheets()

example <- readxl_example("datasets.xlsx")

excel_sheets(example)

الإخراج:

[1] "iris"     "mtcars"   "chickwts" "quakes"

إذا كانت ورقة العمل تحتوي على العديد من الأوراق، فمن السهل تحديد ورقة معينة باستخدام وسيطات الورقة. يمكننا تحديد اسم الورقة أو فهرس الورقة. يمكننا التحقق مما إذا كانت كلتا الدالتين تُرجعان نفس الإخراج باستخدام متطابق ().

example <- readxl_example("datasets.xlsx")
quake <- read_excel(example, sheet = "quakes")
quake_1 <-read_excel(example, sheet = 4)
identical(quake, quake_1)

الإخراج:

## [1] TRUE

يمكننا التحكم في الخلايا التي يجب قراءتها بطريقتين

  1. استخدم الوسيطة n_max لإرجاع عدد n من الصفوف
  2. استخدم وسيطة النطاق مع cell_rows أو cell_cols

على سبيل المثال، قمنا بتعيين n_max يساوي 5 لاستيراد الصفوف الخمسة الأولى.

# Read the first five row: with header
iris <-read_excel(example, n_max =5, col_names =TRUE)

Excel_Sheets

إذا قمنا بتغيير col_names إلى FALSE، فسيقوم R بإنشاء الرؤوس تلقائيًا.

# Read the first five row: without header
iris_no_header <-read_excel(example, n_max =5, col_names =FALSE)

iris_no_header

في إطار البيانات iris_no_header، أنشأ برنامج readxl خمسة أسماء عناصر نائبة. أنتجت الإصدارات القديمة أسماءً من X__1 إلى X__5، بينما تنتج الإصدارات الحالية أسماءً من ...1 إلى ...5.

Excel_Sheets

يمكننا أيضًا استخدام نطاق الوسيطة لتحديد الصفوف والأعمدة في جدول البيانات. في الكود أدناه، نستخدم نمط Excel لتحديد النطاق من A1 إلى B5.

# Read rows A1 to B5
example_1 <-read_excel(example, range = "A1:B5", col_names =TRUE)
dim(example_1)

الإخراج:

## [1] 4 2

يُرجع المثال رقم 1 أربعة صفوف وعمودين. يغطي النطاق A1:B5 خمسة صفوف في جدول البيانات، ولكن يُستخدم الصف الأول كعنوان، ولهذا السبب يكون البُعد 4 × 2.

Excel_Sheets

في المثال الثاني، نستخدم الدالة cell_rows() التي تتحكم في نطاق الصفوف المراد إرجاعها. إذا أردنا استيراد الصفوف من 1 إلى 5، فيمكننا تعيين cell_rows(1:5). لاحظ أن cell_rows(1:5) يُرجع نفس مخرجات cell_rows(5:1).

# Read rows 1 to 5
example_2 <-read_excel(example, range =cell_rows(1:5),col_names =TRUE)			
dim(example_2)

الإخراج:

## [1] 4 5

على النقيض من ذلك، فإن المثال 2 هو 4 × 5. وتتعامل cell_rows(1:5) مرة أخرى مع الصف الأول كعنوان، لذلك يتم إرجاع أربعة صفوف بيانات عبر جميع الأعمدة الخمسة.

Excel_Sheets

في حالة أردنا استيراد صفوف لا تبدأ من الصف الأول، فيجب علينا تضمين col_names = FALSE. إذا استخدمنا النطاق = cell_rows(2:5)، يصبح من الواضح أن إطار البيانات الخاص بنا لم يعد يحتوي على رأس.

iris_row_with_header <-read_excel(example, range =cell_rows(2:3), col_names=TRUE)
iris_row_no_header <-read_excel(example, range =cell_rows(2:3),col_names =FALSE)

Excel_Sheets

يمكنك أيضًا تحديد الأعمدة حسب الحرف، تمامًا كما هو الحال في برنامج Excel:

# Select columns A and B
col <- read_excel(example, range = cell_cols("A:B"))
dim(col)

الإخراج:

## [1] 150   2

ملاحظة: النطاق = cell_cols("A:B")، يُرجع إخراج جميع الخلايا ذات القيمة غير الخالية. تحتوي مجموعة البيانات على 150 صفًا، لذلك تقوم read_excel() بإرجاع صفوف تصل إلى 150 صفًا. يتم التحقق من ذلك باستخدام الدالة dim().

تُحدد الوسيطة na للدالة read_excel() القيم التي يجب اعتبارها مفقودة. يتم حسابها باستخدام الدالتين sum() و is.na().

  1. مجموع
  2. is.na

ها هو الكود

iris_na <-read_excel(example, na ="setosa")
sum(is.na(iris_na))

الإخراج:

## [1] 50

لدينا 50 قيمة مفقودة، وهي الصفوف التي تنتمي إلى فصيلة سيتوسا.

استيراد البيانات من برامج إحصائية أخرى

يتم استيراد الملفات من حزم إحصائية أخرى مع ملاذ حزمة تدعم SAS، وبرنامجي STATA و SPSS. يمكننا استخدام الدالة التالية لفتح أنواع مختلفة من مجموعات البيانات، وفقًا لامتداد الملف:

  • ساس: read_sas ()
  • STATA: read_dta() (أو read_stata()، وهي متطابقة)
  • SPSS: read_sav () أو read_por (). نحن بحاجة للتحقق من التمديد

كل دالة من هذه الدوال تحتاج إلى وسيط واحد فقط، وهو مسار الملف، وتقبل كل منها... URL بسهولة مثل المسار المحلي.

library(haven)

يأتي الملاذ مع كوندارا r-essential وإلا فانتقل إلى الصفحة أو في المحطة الطرفية conda install -c conda-forge r-haven

قراءة ملفات SAS

على سبيل المثال، سنستخدم مجموعة بيانات القبول من IDRE.

PATH_sas <- 'https://github.com/guru99-edu/R-Programming/blob/master/binary.sas7bdat?raw=true'
df <- read_sas(PATH_sas)
head(df)

الإخراج:

## # A tibble: 6 x 4
##   ADMIT   GRE   GPA  RANK
##   <dbl> <dbl> <dbl> <dbl>
## 1     0   380  3.61     3
## 2     1   660  3.67     3
## 3     1   800  4.00     1
## 4     1   640  3.19     4
## 5     0   520  2.93     4
## 6     1   760  3.00     2

قراءة ملفات STATA

بالنسبة لملفات بيانات STATA، يمكنك استخدام read_dta(). نحن نستخدم نفس مجموعة البيانات تمامًا ولكننا نخزنها في ملف .dta.

PATH_stata <- 'https://github.com/guru99-edu/R-Programming/blob/master/binary.dta?raw=true'
df <- read_dta(PATH_stata)
head(df)

الإخراج:

## # A tibble: 6 x 4				
##   admit   gre   gpa  rank				
##   <dbl> <dbl> <dbl> <dbl>				
## 1     0   380  3.61     3				
## 2     1   660  3.67     3				
## 3     1   800  4.00     1				
## 4     1   640  3.19     4				
## 5     0   520  2.93     4				
## 6     1   760  3.00     2

قراءة ملفات SPSS

تقوم الدالة read_sav() بفتح ملف SPSS، والذي يحمل الامتداد .sav.

PATH_spss <- 'https://github.com/guru99-edu/R-Programming/blob/master/binary.sav?raw=true'
df <- read_sav(PATH_spss)
head(df)

الإخراج:

## # A tibble: 6 x 4				
##   admit   gre   gpa  rank				
##   <dbl> <dbl> <dbl> <dbl>				
## 1     0   380  3.61     3				
## 2     1   660  3.67     3			
## 3     1   800  4.00     1				
## 4     1   640  3.19     4				
## 5     0   520  2.93     4				
## 6     1   760  3.00     2

أفضل الممارسات لاستيراد البيانات

اتباع قائمة التحقق أدناه قبل الاستيراد يوفر معظم أعمال التنظيف اللاحقة:

  • التنسيق النموذجي لجدول البيانات هو استخدام الصفوف الأولى كرأس (عادةً اسم المتغيرات).
  • تجنب استخدام المسافات الفارغة في اسم الملف أو العمود، لأنها قد تُقرأ كفاصل بين الأعمدة. استخدم الشرطة السفلية بدلاً من ذلك.
  • يفضل الأسماء المختصرة
  • لا تستخدم الرموز في الاسم. اكتب exchange_rate_dollar_euro بدلاً من exchange_rate_$_€.
  • قم بترميز القيم المفقودة كـ NA بدلاً من الفراغات أو الشرطات أو الأرقام المرجعية مثل -99، والتي يجب تنظيفها بعد ذلك.

استيراد البيانات في لغة R: مرجع الدوال

يسرد الجدول أدناه دالة الاستيراد لكل نوع ملف، والمكتبة التي توفرها، ومعاملاتها الافتراضية:

المكتبة الهدف الوظيفة الوسيطات الافتراضية
تيلس قراءة ملف CSV قراءة.csv() ملف، رأس = صحيح، فاصل = "","
readxl قراءة ملف EXCEL read_excel() المسار، النطاق = NULL، col_names = TRUE
ملاذ قراءة ملف SAS read_sas() مسار
ملاذ قراءة ملف ستاتا read_dta() / read_stata() مسار
ملاذ قراءة ملف SPSS read_sav() مسار

يوضح الجدول الثاني طرق استيراد التحديد باستخدام الدالة read_excel():

الوظيفة الهدف الحجج
read_excel() قراءة عدد ن من الصفوف ن_ماكس = 10
حدد الصفوف والأعمدة كما هو الحال في Excel النطاق = "A1:D10"
حدد الصفوف ذات الفهارس النطاق = صفوف_الخلايا (1:3)
حدد الأعمدة التي تحتوي على حروف النطاق = cell_cols("A:C")

الأسئلة الشائعة

غيّر الإصدار 4.0.0 من R القيمة الافتراضية لـ stringsAsFactors من TRUE إلى FALSE. تبقى أعمدة الأحرف الآن أحرفًا. مرّر الوسيطة صراحةً إذا كان يجب أن يتصرف البرنامج النصي الخاص بك بنفس الطريقة على إصدارات R الأقدم.

استبدال URL مع وضع المسار المحلي الكامل بين علامتي اقتباس، مثل "C:/Users/name/data.csv". استخدم الشرطات المائلة للأمام أو الشرطات المائلة للخلف المزدوجة. Windows، وتأكد من دليل العمل باستخدام getwd().

تقرأ الدالة readxl ملفات .xls و .xlsx بلغة R خالصة بدون أي Java التبعية. تتطلب حزمة xlsx القديمة فقط Java عبر rJavaولهذا السبب يُعد برنامج readxl الخيار الموصى به.

تُعدّ التغييرات الصامتة في أنواع البيانات عند الاستيراد مصدرًا شائعًا لنتائج الذكاء الاصطناعي غير القابلة للتكرار. ويضمن تحديد أنواع الأعمدة بشكل صريح، كما هو موضح في دالة read_csv()، تحميل مجموعة بيانات التدريب بشكل متطابق في كل مرة.

نعم. يمكن للمساعدين المدعومين بالذكاء الاصطناعي تشخيص الفواصل الخاطئة، ومشاكل الترميز، وقراءة العناوين بشكل خاطئ من رسالة الخطأ. تأكد دائمًا من النتيجة باستخدام الدالة str() أو glimpse() قبل متابعة التحليل.

تلخيص هذه التدوينة بـ: