مدخل إلى أطر البيانات ، المقال الأول
في هذا المقال و مجموعة من المقالات التي بعده ، سنتعرف على إحدى أهم بنى المعلومات استعمالا و أهمية في آر و هي أطر المعلومات. هذه البنية المعلوماتية أكثر تركيبا من البنى السابقة كما أنها تعتبر عماد التحليل البياني.
سنتعرف في مقالنا الأول هذا على أطر البيانات ، كيفية إنشائها ، قراءتها و الوصول إلى المعلومات المخزنة ضمنها. كما أول الوظائف التي تستخرج معلومات إحصائية و تحليلية أولى عنها.
في المقال الثاني سنتطرق إلى عمليات أولية يمكن إجراؤها على أطر البيانات مثل إضافة أعمدة أو أسطر ، إدراج بيانات و حذفها و كذا كيفية تحويل أطر البيانات إلى بنى معلومات أخرى مثل المصفوفات و القوائم.
المقال الثالث مخصص لعمليات متقدمة على أطر البيانات تسمح بتحليل أعمق للبيانات و استخراج نتائج إحصائية أولى قابلة للاستعمال و العرض. يتعلق الأمر بدراسة كيفية إستخراج بيانات جديدة من أخرى موجودة ، بترتيب و إعادة ترتيب البيانات ، بتلخيص الجداول و استخراج أطر بيانات تجميعية للأولى
فهرس المقال
- كتابة و قراءة أطر البيانات، تصديرها و إدخالها
- قراءة ملفات CSV (
*.csv
) - معلومات مختلفة عن أطر البيانات
مقدمة
أطر البيانات هي بنى بيانات ثنائية الأبعاد مشكلة من جداول بأسطر و أعمدة حيث يمكن أن يحتوي على أنواع بيانات مختلفة في كل عمود. أطر المعلومات مرتكزة في بنيتها على القوائم و تشترك في صفات عديدة معها في فهرستها ((اقرأ هذا المقال للتعمق أكثر)). هي كذلك تحمل صفات شكلية للمصفوفات في تنظيمها ثنائي البعد إلا أنها تقبل أعمدة من طبائع مختلفة. يمكن تشكيلها من مجموعات من المتغيرات. تعتبر أطر البيانات أهم بنية تعتمد عليها أغلب أنظمة النمذجة في آر.
1. إنشاء إطار بيانات
تُنشؤ أطر البيانات وفق الأمر data.frame()
حيث تثبت بها مختلف الأعمدة المكونة لإطار البيانات متبوعة إن لزم الأمر بوسائط أخرى حول كيفية التعامل مع طبائع المعطيات المختلفة و القيم المعدومة و غيرها. يمكن التعمق أكثر بقراءة التوثيق الرسمي عبر الأمر :
?data.frame
في المثال المقبل ، ننشئ إطار بيانات نعطيه اسم my_dataframe
و نضمنه معلومات شخصية عن أعضاء ناد ثقافي صغير حيث تكون المعلومات حول الاسم ، العمر و مدينة الميلاد مثلا. هاته المعلومات مضمنة في المتغيرات الاسم
، العمر
و المدينة
التي نعرفها أثناء إنشاء إطار البيانات.
البيانات الأولية التي نصعها في إطار البيانات المقبل هي الموضحة في الجدول التالي :
الاسم (name) | الجنس(gender) | العمر (age) | المدينة (town) |
---|---|---|---|
أحمد | 25 | M | الجزائر |
فاطمة | 30 | F | بسكرة |
خالد | 28 | M | تلمسان |
الجدول 1: أعضاء ناد ثقافي
نعرف إطار البيانات عبر تعريف مختلف متغيراته (الأعمدة) على شكل متجهات أسماؤها على التوالي name
، gender
، age
و town
كما يلي :
my_dataframe <- data.frame(
name = c("أحمد", "فاطمة", "خالد"),
gender = as.factor(c("M","F","M")),
age = c(25, 30, 28),
town = c("الجزائر", "بسكرة", "تلمسان")
)
لإظهار إطار البيانات الجديد ، نستعمل وظيفة الطبع print()
و تكون النتيجة حسب الآتي :
print(my_dataframe)
#name gender age town
#1 أحمد M 25 الجزائر
#2 فاطمة F 30 بسكرة
#3 خالد M 28 تلمسان
لاحظ أن إطار البيانات مشكل من مجموعة من المتغيرات المشكلة من متجهات بحيث يحتوي كل متجه على نفس العدد من القيم. كل متجه يمثل عمودا في جدول إطار البيانات و يسمى متغيرا. تنتظم أطر البيانات كذلك في أسطر حيث كل سطر يسمى مشاهدة. عند كتابة معطيات إطار البيانات ، ترجى مراعاة الترتيب حيث كل قيمة في المتغير تراعي مكانها الصحيح ضمن المشاهدات.
في الحالة التي قدمنا ، أعلاه ، بجب التثبت من أن العضو فاطمة لها 30 سنة و هي مقيمة ببسكرة بينما خالد ، 25 سنة ، مقيم بتلمسان و أحمد ، 28 سنة مقيم بالجزائر. سنتعرف في الجزء المقبل على كيفية استخراج البيانات من الإطار و التعامل معها و تحليلها.
2. كتابة و قراءة أطر البيانات، تصديرها و إدخالها
من أهم مقومات العمل بأطر البيانات إمكانية قراءتها من ملفات خارجية و كذا تصديرها كملفات من نسيقات مختلفة. أهم هاته التنسيقات هما اثنان :
- ملفات نصية [*.txt]
- ملفات القيم المفصولة بفواصل [*.csv]
و هما الأكثر شيوعًا.
كتابة البيانات إلى ملفات
بعد معالجة البيانات، قد تحتاج إلى تصديرها إلى ملفات نصية أو CSV.
1. تصدير البيانات إلى ملف نصي *.txt
يمكن استخدام write.table()
لتصدير البيانات إلى ملف نصي. تكتب الصيغة بتحديد متغير إطار البيانات إضافة إلى اسم الملف الذي ستخزن فيه المعلومات و الفاصل المعتمد في الكتابة separator و غيرها من الإعدادات الاختيارية الأخرى. تشبه الصيغة عادة هذا الشكل : write.table(dataframe, file = "output.txt", sep = "\t", ...)
. يمكن الحصول على توثيق إضافي بكتابة الأمر ?write.table
.
سنستعمل في المثال التالي إطار البيانات المعرف أعلاه my_dataframe
.
# تصدير إطار البيانات إلى ملف نصي بفواصل تبويب
write.table(my_dataframe, file = "my_dataframe.txt", sep = "\t")
لإيجاد الملف الجديد my_dataframe.txt وفتحه ببرامج أخرى يرجى مراجعة مستند العمل الذي يعمل عليه آر و الذي يمكن التحصل عليه بالأمر getwd()
.
2. تصدير البيانات إلى ملف *.csv
يمكن كذلك حفظ إطار البيانات كملف CSV باستخدام الأمر write.csv()
. تنسيق [.csv] - CSV - Commas Separated Values** أو القيم المفصولة بفواصل تنسيق مستعمل جدا محدد به قبلا فاصل القيم و الخانات في الجدول و هو الفاصلة ","
. إذا أردت استعمال النقطة-الفاصلة ";"
كفاصل فيمكنك استعمال الأمر write.csv2()
. تشبه صيغة الكتابة صيغة كتابة الملف **[.txt] إلا أناه لا تحوي تخصيص نوع الفاصل. تكتب صيغتها الأساسية بتحديد المتغير و كتابة اسم الملف المصدر إليه إضافة إلى خصائص اخرى يمكن التعرف عليها عبر قراءة التوثيق و خاصة التوثيق الرسمي باستعمال الأمر ?write.csv()
. في المثال التالي ، تطبيق على إطار البيانات المعرف أعلاه my_dataframe
.
# تصدير البيانات إلى ملف CSV
write.csv(my_dataframe, file = "my_dataframe.csv")
بنفس المبدأ ، لإيجاد الملف الجديد my_dataframe.csv وفتحه ببرامج جداول أو غيرها ، يرجى مراجعة مستند العمل الذي يعمل عليه آر و الذي يمكن التحصل عليه بالأمر getwd()
.
إذا كنت بحاجة إلى استخدام فاصلة منقوطة (;
) بدلاً من الفاصلة العادية، يمكنك استخدام write.csv2()
:
# تصدير البيانات إلى ملف CSV بفاصلة منقوطة
write.csv2(my_dataframe, file = "my_dataframe_2.csv")
قراءة البيانات على آر
مثلما أمكننا كتابة أطر البيانات في ملفات من مقاسات مختلفة و تصديرها ، يمكننا قراءة ملفات خارجية نصية وجداول بتنسيقات مختلفة باستخدام وظائف على آر و هي عديدة. تسمح لنا قراءة هاته الملفات الخارجية بمعالجة و تحليل بيانات و التواصل مع بيئات عمل و برامج مختلفة تتعامل مع نفس أصناف الملفات و التنسيقات و خاصة منها برامج الجداول.
1. قراءة ملفات النصوص *.txt
يمكن استخدام الأمر read.table()
لقراءة ملفات النصوص [*.txt]. يحتاج الأمر إلى تحديد الملف المعني و الذي يجب أن يكون موجودا في مستند العمل الرئيسي لآر أو أن يحدد مكانه و طريقه على الحاسوب. يحدد كذلك الفاصل باستعمال الخاصية sep
كما يمكن تحديد خصائص أخرى متعلقة بقراءة أصناف البيانات ، التعامل مع القيم المفقودة ، عناوين المتغيرات header
، الخ. للتعمق في الخصائص المتاحة ، اقرأ التوثيق المنبثق من الأمر ?read.table()
. من الأفضل أن يحفظ الأمر read.table()
حيث تكتب الصيغة الرئيسية كما يلي : dataframe <- read.table("data.txt", sep = " ")
2. قراءة ملفات *.csv
#قراءة ملفات *.csv
بنفس المنهجية ، يمكن قراءة ملفات *[.csv]** على آر باستخدام الأمر read.csv()
و باعتماد صيغة تحدد الملف المعني و الذي يجب أن يكون متواجدا على مستند العمل أو أن تحدد طريقه بشكل صحيح إضافة إلى خصائص أخرى تحدد في وسائط متعلقة بقراءة أصناف البيانات ، التعامل مع القيم المفقودة ، عناوين المتغيرات header
، الخ. على ملف csv لا يحدد الفاصل.
# قراءة ملف CSV مع تحديد أن الصف الأول يحتوي على أسماء الأعمدة
my_csv_data <- read.csv("my_dataframe.csv", header = TRUE)
إذا كان الملف يستخدم فاصلة منقوطة (;
) بدل الفاصلة العادية، يمكن استخدام read.csv2()
بنفس كريقة read.csv():
# قراءة ملف CSV بفاصلة منقوطة
my_csv_data2 <- read.csv2("my_dataframe_2.csv", header = TRUE)
3. الوصول إلى عناصر إطار البيانات
للوصول و تحديد قيم أو متغيرات بعينها في أطر البيانات ،يمكن استعمال عدة طرق. قد يتعلق الأمر باستخراج إطار بيانات فرعي من الأول مشكل من عمود أو مجموعة أعمدة مثلا و قد يتعلق الأمر باستخراج معطيات عمود بعينه أو سطر بعينه أو مجموعة من الأعمدة و الأسطر كما قد يتعلق الأمر باستخراج معطيات بعينها من الجدول. سنبين هنا بعضا من طرق الحصول على هاته المعلومات :
استخراج إطار بيانات فرعي مشكل من عمود أو مجموعة أعمدة
يمكن الوصول إلى معطيات بعينها عبر استخراج إطر بيانات فرعي من الإطار الأول و ذلك باستعمال رقم ترتيب الأعمدة المراد استخراجها. في حالة عمود واحد نستعمل الصيغة dataframe[2]
و أما في حالة مجموعة من الأعمدة ، ندرجها في متجه وفق الصيغة التالية dataframe[c(1,2,4)]
هنا مثال عن استخراج إطار بيانات فرعي من الإطار السابق my_dataframe
، باعتماد العمود رقم [3]
my_dataframe[3]
# العمر
1 25
2 30
3 28
أو باستخراج إطار بيانات فرعي مشكل من مجموعة أعمدة. مثلا العمود [1]
و العمود [4]
:
my_dataframe[c(1,4)]
#الاسم المدينة
#1 أحمد الجزائر
#2 فاطمة بسكرة
#3 خالد تلمسان
في كلتا الحالتين ، طبيعة النتيجة هي إطار معلومات جديد. يمكن التأكد من ذلك عبر تحديد نوع المعطى باستعمال أمر class()
و الذي كنا تعرضنا إليه في المقال السابق كما يمكن تخزين النتيجة في متغير جديد و ستكون طبيعته هي إطار بيانات :
new_dataframe <- my_dataframe[c(1,3)]
class(new_dataframe)
# [1] "data.frame"
استخراج بيانات مختلفة من إطار البيانات
قد يكون الهدف هو الوصول إلى معطيات بعينها دون الحاجة إلى إنشاء إطار بيانات جديد و لكن بغرض استخراجها ، عرضها أو معالجتها كبيانات منفردة.
استخراج بيانات عمود من إطار البيانات
يمكن استعمال الصيغ التالية لاستخراج بيانات عمود بعينه :
- عبر تحديد اسم العمود المعني باعتماد الصيغة
dataframe$column_name
my_dataframe$age
#[1] 25 30 28
- أو عبر تحديد ترتيبه في الجدول باعتماد الصيغة
dataframe[,3]
. في هذا الخصوص ، الفاصلة,
التي تسبق رقم الترتيب تشير إلى فكرة الإحداثيات [x,y] حيث الأعمدة تشير إلى الإحداثيات العمودية y أو الترتيب :
my_dataframe[,4]
#[1] "الجزائر" "بسكرة" "تلمسان"
لاحظ أنه في كلتا الحالتين السابقتين ، فإن طبيعة بيانات النتيجة هي عبارة عن متجه مشكل من قيم العمود المطلوب. يمكنك التأكد من ذلك دائما عبر أمر class()
.
class(my_dataframe[,4])
# [1] "character"
نلاحظ أن النتيجة تعطينا طبيعة بيانات المتجه المتمثل في المتغير - العمود. في هذه الحالة ، طبيعة البيانات هي سلاسل حروف أو character.
استخراج بيانات سطر من إطار البيانات
من أجل استخراج معطيات سطر بعينه ، تكتب الصيغة باستعمال رقم ترتيبه متبوعا بفاصلة كما يلي dataframe[2,]
. كتابة رقم الترتيب قبل الفاصلة تشير إلى إحداثيات السطر كالأفقية x ضمن نظام إحداثيات إطار البيانات [x,y] :
my_dataframe[2, ]
# الاسم العمر المدينة
#2 فاطمة 30 بسكرة
بالتأكد من طبيعة المعطى الناتج عبر وظيفة class()
، فإننا نجد أن المعطيات الناتجة بفعل طبيعة مكوناتها المختلفة معرّفة على آر في شكل أطر بيانات “data.frame”.
class(my_dataframe[2, ])
# [1] "data.frame"
الوصول إلى قيمة بعينها باستعمال إحداثيات السطر و العمود
بنفس منطق ما تم أعلاه، تستعمل إحداثيات السطر و العمود لتحديد معطيات بعينها وفق الصيغة dataframe[2,3]
my_dataframe[2,3]
# [1] "بسكرة"
كما يمكن استعمال ترتيب القيمة المطلوبة ضمن العمود الذي تنتمي إليه وفق الصيغة dataframe$column[index_number]
:
my_dataframe$town[2]
# [1] "بسكرة"
استخراج بيانات معينة تحقق شرطًا معينًا
يمكن إنشاء إطار بيانات فرعي يحقق شروط معينة لمشاهداته. مثلا ، تحديد عدد الأعضاء اللذين يتجاوزون 25 سنة. يجب إدراج هذا الشرط المنطقي حسب الصيغة التالية بتعريف إطار بيانات باسم subset_df
مثلا تخزن فيه البيانات التي تحقق الشرط المقصود :
subset_df <- dt[my_dataframe$age > 25, ] # استخراج الأشخاص الذين تزيد أعمارهم عن 25
print(subset_df)
تعطينا النتيجة إطار بيانات جديد يحوي الأعضاء الذي يجاوز عمرهم 25 سنة :
# name gender age town
#2 فاطمة F 30 بسكرة
#3 خالد M 28 تلمسان
باستخدام وظيفة subset
يمكن كذلك استعمال أمر subset()
لذات الغرض. أمر subset من أهم الوظائف المستعملة بتحليل البيانات على آر. يسمح بتحقيق شروط معينة لاختيار البيانات المحللة و يعتمدة في وظائف عدة. يستعمل هنا لاستخراج أطر بيانات تحقق شرطا أو أكثر. مثلا هنا ، استخراج إطار بيانات فرعي من update2_my_df
للأعضاء الذكور المتجاوز عمرهم 25 سنة. في هاته الحالة ، تستعمل الصيغة المنطقية و - AND ضمن الوظيفة subset وفق الصيغة : subset(dataframe,condition1 & condition2)
. أنظر المثال :
subset2_df <- subset(my_dataframe, age > 25 & gender == "M")
print(subset2_df)
4. معلومات مختلفة عن أطر البيانات
سنتعرض في هاته الفقرة إلى مجموعة أوامر تعطينا معلومات عن أطر البيانات تساعدنا في فهم معطياتها و معالجتها.
عناوين أعمدة أطر البيانات
قد نحتاج في معالجتنا الإحصائية الحصول على عناوين أو أسماء أعمدة أطر البيانات. لهذا الغرض يمكننا استعمال الأمر names(dataframe)
و الذي يعيد لنا متجها يحوي أسماء العناوين.
names(my_dataframe)
# [1] "الاسم" "العمر" "المدينة"
يمكن استعمال هاته التعليمة في تغيير أسماء الأعمدة كما سنرى في الفقرات المقبلة.
عرض الأسطر الأولى لأطر البيانات
من بين التعليمات المستعملة كثيرا و المفيدة أثناء العمل هي تعليمة head(dataframe)
و التي تسمح بقراءة أولى عشرة أسطر من إطار البيانات بحيث تعطينا فكرة عن محتوى الإطار ، خاصة بعد إجراء أي تعديل.
head(my_dataframe)
عرض الأسطر الأخيرة لأطر البيانات
كذلك ، من بين التعليمات المستعملة كثيرا و المفيدة أثناء العمل للتأكد خاصة من اكتمال كل البيانات في إطار المعلومات تعليمة tail(dataframe)
و التي تسمح بالاطلاع على آخر عشرة أسطر من إطار البيانات.
tail(my_dataframe)
الحصول على ملخص إحصائي لأطر البيانات
تعليمة summary(dataframe)
و التي اطلعنا عليها على مستوى المتجهات تعتبر كذلك من أهم الوظائف التي تسمح لنا بالحصول على فكرة عن الطبيعة الإحصائية للبيانات حيث تبرز لنا لكل عمود في الإطار مجموعة معطيات مثل المعدل ، القيمة المتوسطة ، القيمة الأدنى و الأقصى و كذلك قيم الأرباع الأول و الثالث (طبعا الربع الثاني هو القيمة المتوسطة و الربع الرابع هو القيمة الأعلى).
summary(my_dataframe)
يعطينا هاذ الأمر ملخص البيانات الإحصائية مبينا في الجدول التالي :
الاسم العمر المدينة
Length:3 Min. :25.00 Length:3
Class :character 1st Qu.:26.50 Class :character
Mode :character Median :28.00 Mode :character
Mean :27.67
3rd Qu.:29.00
Max. :30.00
يالنسبة للمتغير - إطار البيانات my_dataframe ، يشير الملخص الإحصائي للعمود age أن متوسط mean العمر في المجموعة المدروسة هو 27.67 سنة و أن القيمة المتوسطة median هي 28 سنة إلى غير ذلك من المعطيات.
بالنسبة للعمودين الاسم و المدينة ، و هما عمودان يحملان معطيات حروفية ، فالملخص يعطي لنا ثلاثة معلومات ؛ أولا، طول length المتجه وهو 3 و أن نوع المعطى العام mode هو *character و أن صنفه *class character.
الحصول على طبيعة المعطيات المشكلة لأطر البيانات
يمكن كذلك الحصول على نظرة على إطار البيانات عبر قراءة معطيات أولى و التعرف على طبيعتها باستعمال الأمر str(dataframe)
. هاته الخاصية مفيدة جدا، خاصة في حالة الجداول الكبيرة و من أجل التأكد من قراءة البرنامج الصحيحة لصحة البيانات حيث أنه قد يحدث مثلا لسبب ما أن تسجل القيم العددية كسلاسل حروف. لذا ، فإنه يمكن التعرف على طبيعة بيانات أعمدة أي إطار بيانات باستعمال هذا الأمر و التي تعرض برموز حرورفها المميزة مثل chr للدلالة على السلاسل الحروفية ، num للدلالة على القيم العددية. أنظر المثال التالي :
str(my_dataframe)
حيث النتيجة تكون كما يلي :
#'data.frame': 3 obs. of 4 variables:
# $ name : chr "أحمد" "فاطمة" "خالد"
# $ gender: Factor w/ 2 levels "F","M": 2 1 2
# $ age : num 25 30 28
# $ town : chr "الجزائر" "بسكرة" "تلمسان"
لاحظ أن وظيفة str()
و التي تستعمل لمختلف أنواع المتغيرات تبين نوع المتغير في سطرها الأول حيث أبرزت لنا أن my_dataframe
هو إطار بيانات 'data.frame'
كما تعطي لنا معلومات عن شكله حيث أن إطار بياناتنا مشكل من ثلاثة متغيرات - variables (أي التسمية الإحصائية للأعمدة) و ثلاثة مشاهدات-observations (التسمية الإحصائية للأسطر).
معرفة أبعاد أطر البيانات
إذا أردنا الحصول فقط على معلومات شكل إطار البيانات ، أي عدد الأعمدة و الأسطر ، يمكن مباشرة استعمال التعليمة dim(dataframe)
و التي تعيد نتيجة على شكل متجه من عددين ، الأول للأسطر و الثاني للأعمدة.
dim(my_dataframe)
# [1] 3 4
النتيجة المعروضة تبين لنا متجها من عددين ، الأول 3 يعني الأسطر أو المشاهدات و الثاني 4 يعني الأعمدة أو المتغيرات.
تطرقنا في هذا المقال إلى تعريف أطر البيانات ، كيفية إنشائها ، كيفية قراءتها من ملفات مختلفة و تصديرها إليها و كذا بعض الأوامر الرئيسية للحصول على معلومات مختلفة ، انطلاقا من بيانات أطر البيانات ذاتها وصولا إلى بيانات تركيبية حولها مثل الملخصات الإحصائية. في المقال المقبل ، سنتعرض إلى أولى خطوات تحرير أطر البيانات و العمليات الأولى الخاصة بذلك.