السلسلات و المتجهات

سنهتم في هذا المقال بتقديم أولى بُنى المعلومات الأساسية المعتمدة في آر و ذلك بعد أن قدمنا أشكالا بسيطة للمعطيات و المتغيرات في المقال السابق. سنتعرض هنا إلى المتجهات Vectors لكن في البداية ، سنبتدئ ببعض أشكال المتتاليات الحسابية و سلسلات البيانات.

1. سلسلات البيانات

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

هذا مثال لسلسلة بسيطة من الأرقام من 0 إلى 10.

0:10
# [1]  0  1  2  3  4  5  6  7  8  9 10

يمكن خزنه في متغير sequence بحيث :

sequence <- 0:10
print(sequence) #أمر الطبع وقد تطرقنا إليه في درس مضى
# [1]  0  1  2  3  4  5  6  7  8  9 10

نجد كذلك الأمر seq() والذي يسمح لنا بالحصول على سلسلات أعداد بأساس محدد تكتب بالصيغة التالية :

seq(0,20,by=2)
# [1]  0  2  4  6  8 10 12 14 16 18 20

يمكن كذلك تكرار معطى رقمي أو حرفي في سلسلة معينة عبر استعمال الوظيفة rep() بوسيطتين ، الأولى هب المعطى المكرر و الثانية هي مقدار أو عدد التكرار.

مثال :

rep(5,10) 
# 5 هو العدد المكرر و 10 هو مقدار التكرار. النتيجة هنا في الأسفل
# [1] 5 5 5 5 5 5 5 5 5 5

rep("bayany",5) # تكرار سلسلة حروف بياني 5 مرات
#[1] "Bayany" "Bayany" "Bayany" "Bayany" "Bayany"

2. المتجهات (Vectors)

المتجه هو مجموعة مرتبة من معطيات من النفس الطبيعة القاعدية. قد تكون رقمية ، حرفية أو منطقية ، بولية (Boulean). تدرج بواسطة الأمر التالي : c(قيمة1,قيمة2,قيمة3,...). هنا أمثلة بسيطة :

v1 <- c(2,3,5,12,11,10)#numeric vector متجه رقمي
v2 <- c("أبجد","هوز","حطي","كلمن","سعفص","قرشت")#character حرفي
v3 <- c(TRUE,FALSE,FALSE,TRUE,TRUE,FALSE) #logical منطقي
 #عرض المتجهات
v1 #[1]  2  3  5 12 11 10
v2 #[1] "أبجد" "هوز"  "حطي"  "كلمن" "سعفص" "قرشت"
v3 #TRUE FALSE FALSE  TRUE  TRUE FALSE

يمكن أن يتشكل المتجه من معطيات على شكل متجهات. أنظر المثال الآتي :

v4 <- c(v1,v2,v3)
v4 
#[1] "2"     "3"     "5"     "12"    "11"    "10"    "أبجد"  "هوز"   "حطي"  
#[10] "كلمن"  "سعفص"  "قرشت"  "TRUE"  "FALSE" "FALSE" "TRUE"  "TRUE"  "FALSE"

2.1. العمليات على المتجهات

يمكن إجراء عمليات حسابية على متجهات من طبيعة رقمية أو منطقية سواءا بين متجهين v1+v2, v1-v2, v1*v2, v1/v2 أو بين متجه و عدد v1+n, v1-n, v1*n, v1/n.

2.1.1. أمثلة عن العمليات الحسابية على المتجهات الرقمية

في البداية ، سندخل معطيات المتجهين v1 و v2 :

#إدخال معطيات المتجه
v1 <- c(3,4)
v2 <- c(3,9)

سنكتب أوامر إجراء عمليات حسابية على المتجهين متبوعة بعرض النتيجة :

عملية جمع المتجهين v1 ، v2 مع النتيجة :

v1+v2 
#[1]  6 13

عملية طرح المتجه v2 من v1 مع النتيجة :

v1-v2 
#[1]  0 -5

عملية ضرب المتجهين v1 ، v2 مع النتيجة :

v1*v2 
#[1]  9 36

عملية قسمة المتجه v1 على v2 مع النتيجة :

v1/v2 
#[1] 1.0000000 0.4444444

هنا بعض أمثلة عمليات حسابية بين متجه و عدد على المتجهين السابقين v1 و v2 :

جمع متجه و عدد
v1+4 
#[1] 7 8
قسمة متجه على عدد
v2/3 
#[1] 1 3
طرح عدد من متجه
v1-6 
#[1] -3 -2
ضرب متجه بعدد
v1*12 
#[1] 36 48

2.1.2. أمثلة عن العمليات الحسابية بين متجهات منطقية

يمكن كذلك إجراء عمليات على متجهات منطقية أو بين متجهات منطقية و عددية. في هاته الحالة تعتبر قيم المتجه المنطقي أعدادا طبيعية حيث TRUE = 1 و FALSE = 0.

جرب الأمثلة التالية على المتجهين المنطقيين v3 و v4 :

إدخال معطيات المتجهين المنطقيين v3 و v4 :
v3 <- c(T,F,T) # يمكن على آر اختصار العبارات المنطقية بحرفها الأول : T(TRUE), F(FALSE)
v4 <- c(F,F,T)
عملية متجهين

جمع المتجهين v3 و v4 متبوعة بالنتيجة:

v3+v4 
#[1] 1 0 2

ضرب المتجهين v3 و v4 متبوعة بالنتيجة:

v3*v4 
#[1] 0 0 1

طرح المتجه v4 من v3 متبوعة بالنتيجة:

v3-v4 
#[1] 1 0 0

قسمة المتجه v3 على v4 متبوعة بالنتيجة:

v3/v4 
#[1] Inf NaN   1
عملية متجه و عدد

هنا تكتب العبارة متبوعة بنتيجتها على آر : جمع المتجه v3 و العدد 2 متبوعة بالنتيجة:

v3+2 
#[1] 3 2 3

طرح العدد 1 من المتجه v3 متبوعة بالنتيجة:

v4-1 
#[1] -1 -1  0

ضرب المتجه v3 و العدد 2 متبوعة بالنتيجة:

v3*2 
#[1] 2 0 2

قسمة المتجه v3 على العدد 3 متبوعة بالنتيجة:

v4/3 
#[1] 0.0000000 0.0000000 0.3333333

2.2. استخراج معطيات من متجهات

لاستخراج معطيات من متجهات ، نستخدم عادة ترتيب المعطى المقصود في المتجه باعتماد الصيغة التالية : المتجه[الترتيب].

في آر ، يتم الترتيب انطلاقا من الرقم 1 عكس برامج أخرى مثل بايثون أين الترتيب ينطلق من 0.

هذا المثال لمتجه يحمل معطيات معدلات طلبة قسم جامعي. أدرجناها في متجه اسمه grades.

grades <- c(13.26, 12.97, 13.05, 11.35, 10.87, 10.25, 11.85,  4.84, 12.57,  6.97, 10.44, 3.45, 11.55, 12.03, 11.53)

سننجز مجموعة عمليات على هذا المتجه لاستخراج علامات لطلبة مختلفين.

طول المتجه

أولا ، يجب معرفة طول المتجه ، أي عدد القيم الموجودة به. نستعمل هنا الصيغة length()

#1. استخراج طول المتجه
length(grades) #[1] 15

استخراج بعض المعطيات المكونة للمتجه

ثانيا ، سنحاول الحصول على استخراج بعض معدلات الطلبة حسب ما يلي :

  1. استخراج معدل الطالب رقم 5 و عرض النتيجة :
# استخراج معدل الطالب 5 
grades[5] 
#[1] 10.87
  1. استخراج معدلات الطلبة من 6 إلى 10 و حفظها في متجه جديد grades_susbset1 باستعمال صيغة المجال grades[6:10] :
# استخراج متجهات الطلبة من 6 إلى 10 و حفظها في متجه جديد.
grades_subset1 <- grades[6:10]
grades_subset1 
#[1] 10.25 11.85  4.84 12.57  6.97
  1. ثم في الأخير ، استخراج معدلات الطلبة 2 ، 4 و 6 و حفظها في متجه جديد grades_susbset2. هنا تحدد القيم المطلوبة بالصيغة التالية : grades[c(2,4,6)]

#استخراج متجهات الطلبة 2 ، 4 و 6 و حفظها في متجه جديد
grades_subset2 <- grades[c(2,4,6)]
grades_subset2 
#[1] 12.97 11.35 10.25

الحصول على معطيات إحصائية من المتجه

هناك إمكانيات كثيرة لاستخراج معطيات من المتجهات ستجدونها في التوثيق و لكن يمكن شرح بعضها. سنستمر بالعمل على المتجه السابق grades :

  1. الترتيب عبر تعليمة order(vector, decreasing = T) . هذا الأمر يعطينا ترتيبا تصاعديا أو تنازليا لكل قيمة. يمكن تحديد وسيطة تبين اتجاه الترتيب ، متصاعدا أم متنازلا :
order(grades,decreasing = T) # decreasing = TRUE
# [1]  1  3  2  9 14  7 13 15  4  5 11  6 10  8 12

order(grades) # الترتيب الأصلي تصاعدي ، أي decreasing = FALSE
# [1] 12  8 10  6 11  5  4 15 13  7 14  9  2  3  1
  1. عكس اتجاه المتجه عبر تعليمة rev(vector) و هذه التعليمة تعكس ترتيب قيم المتجه الأصلي.
rev(grades)
# [1] 11.53 12.03 11.55  3.45 10.44  6.97 12.57  4.84 11.85 10.25 10.87 11.35
# [13] 13.05 12.97 13.26
  1. الحصول على معلومات إحصائية حول المتجه : هنا نبدأ في الحصول على معلومات ذات طبيعة إحصائية. يمكن الحصول على المجموع عبر أمر sum(vector)القيمة الأعلى (المعدل الأعلى) عبر أمرmax(vector) أو الأدنى min(vector) أو المعدل mean(vector) أو الوسيط median(vector) أو الانحراف المعياري Standard deviation sd(vector). يمكن كذلك الحصول على مجموعة كاملة من المعلومات الإحضائية عبر الأمر summary(grades).

سنجرب كل هذا على متجهنا grades :

المجموع ‍‍sum()

sum(grades) 
#[1] 156.98

القيمة الأعلى ‍‍max()

max(grades) 
#[1] 10.46533

القيمة الأدنى ‍‍min()

min(grades) 
#[1] 3.45

المعدل ‍‍mean()

mean(grades) 
#[1] 10.46533

الوسيط ‍‍median()

median(grades) 
#[1] 11.53

الانحراف المعياري ‍‍sd()

sd(grades) 
#[1] 2.999276

الملخص الإحصائي ‍‍sumamry()

summary(grades)
#   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
#   3.45   10.35   11.53   10.47   12.30   13.26 

نلاحظ أننا بهذا نستطيع إجراء تحليل بسيط لبيانات توزيع لمعدلات الطلبة انطلاقا من متجه على آر.

2.3. إضافة قيم جديدة لمتجه

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

s_office<- c(13,20,15,00,20,00,14.62,18.12,15)
length(s_office) #[1] 9

اتضح أن هناك مكاتب لم تُحسب و يجب إدراجها في هذا المتجه. لهذا الغرض ، سنضيفها له و سنتبع لهذا الغرض طريقتين.

الطريقة الأولى عبر إدخال متجه جديد s_office2به قيم المكاتب الإضافية

s_office2<-c(10.12, 8.50, 21.05)

ندمج المتجهين s_office و s_office2 في متجه جديد Surf_Office يحوي كل المساحات المكتبية :

Surf_Office<- c(s_office, s_office2)
Surf_Office #[1] 13.00 20.00 15.00  0.00 20.00  0.00 14.62 18.12 15.00 10.12  8.50 21.05

الطريقة الثانية، عبر إضافة القيم الجديدة إلى المتجه الأول مباشرة و نحفظها في متجه جديد هو Surf_Office1

ندرج المتجه الأول كقيمة في المتجه النهائي و نضيف عليها مباشرة القيم المتبقية.

Surf_Office1 <-c(s_office, 10.12, 8.50, 21.05)
Surf_Office1 #[1] 13.00 20.00 15.00  0.00 20.00  0.00 14.62 18.12 15.00 10.12  8.50 21.05

من أجل التأكد من صحة الطريقتين ، يمكننا مقارنة المتجهين Surf_Office و Surf_Office1 باستعمال الأمر identical() :

identical(Surf_Office, Surf_Office1)
#[1] TRUE

2.4. تغيير أو تصحيح قيمة أو مجموعة قيم بعينها

قد نضطر كذلك لتغيير قيمة معينة متجه أو تصحيحها. هنا يمكن أن نستعمل خاصية إيجاد القيمة حسب ترتيبها ثم وضع القيم الجديدة مكان القديمة وفق الأمر التالي:

Surf_Office[1] <-12.00
Surf_Office[1]#[1] 12

يمكن أن تكون الكتابة بالطريقة التالية :

11->Surf_Office[2]
Surf_Office[2]#[1] 11

تغيير مجموعة قيم

بنفس الطريقة يمكن تغيير مجموعة قيم باستعمال صيغة المجال [value2:value1].

Surf_Office[3:5]<-c(13.21,10.98,21.02)
Surf_Office[3:5]#[1] 13.21 10.98 21.02

أو بتحديد متجه من القيم المرغوب تغييرها :

Surf_Office[c(7,9)]#[1] 14.62 15.00
Surf_Office[c(7,9)] <- c(08.21,17.15)
Surf_Office[c(7,9)]#[1]  8.21 17.15

خلاصة

في هذا المقال ، تعرضنا إلى كيفية إدراج متجهات على آر ثم كيفية إجراء عمليات عليها و كيفيات استخراج معلومات منها، بما فيها الحصول على قيم إحصائية تخصها و كذا في النهاية كيفية تغييرها أو تصحيحها.

كُتب في 11/02/2025