التعامل مع المتجهات Vectors في لغة R

التعامل مع المتجهات Vectors في لغة R

عندما تبدأ رحلتك مع لغة R، ستلاحظ بسرعة أن المتجهات ليست مجرد نوع بيانات عادي، بل هي قلب اللغة وروحها الحقيقية. كثير من المبتدئين يظنون أن R تشبه أي لغة أخرى في التعامل مع القيم، لكنهم يكتشفون لاحقًا أن أغلب قوة R تأتي من قدرتها على العمل مع المتجهات بسهولة مذهلة. المتجه في R ليس فقط مجموعة من القيم، بل هو الأساس الذي تُبنى عليه العمليات الحسابية، والتحليل الإحصائي، وتنظيف البيانات، وتجهيز الجداول، وحتى الكثير من الرسوم البيانية والنماذج.

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

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


ما هو المتجه في R؟

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

مثلًا، إذا كتبت:

x <- c(1, 2, 3, 4, 5)

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

names <- c("Ali", "Sara", "Omar")

فقد أنشأت متجهًا نصيًا. وإذا كتبت:

flags <- c(TRUE, FALSE, TRUE)

فهنا لديك متجه منطقي.

هذا المفهوم بسيط ظاهريًا، لكنه بالغ الأهمية. لأنه يعني أن كل عنصر في المتجه يمكن الوصول إليه ومعالجته بطريقة موحدة. وعندما تكون لديك آلاف أو ملايين القيم، فإن العمل المتجهِي يصبح أكثر من مجرد ميزة، بل ضرورة حقيقية.


لماذا المتجهات مهمة جدًا في R؟

الجواب باختصار: لأن R مبنية عليها من الأساس. كثير من العمليات التي تقوم بها في R ليست سوى عمليات على متجهات. عندما تجمع رقمين، قد يبدو الأمر بسيطًا جدًا، لكن R تفكر على مستوى المتجهات حتى في هذه اللحظة. عندما تحسب المتوسط، أو ترشح البيانات، أو تطبق شرطًا على عمود كامل في data frame، فأنت عمليًا تعمل مع متجهات.

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

ولذلك، إذا أردت أن تتقن R، فلا يكفي أن تعرف الأوامر فقط. يجب أن تفهم المتجهات بعمق. لأن كل شيء تقريبًا يعود إليها في النهاية.


إنشاء المتجهات في R

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

x <- c(10, 20, 30, 40)
x

الناتج سيكون متجهًا عدديًا من أربع قيم.

إنشاء متجه نصي

cities <- c("Rabat", "Casablanca", "Fes", "Marrakech")
cities

إنشاء متجه منطقي

answers <- c(TRUE, FALSE, TRUE, TRUE)
answers

إنشاء متجه فارغ ثم تعبئته لاحقًا

v <- vector()
v

أو مع تحديد النوع والطول:

v <- vector("numeric", 5)
v

هذا ينشئ متجهًا عدديًا من خمسة عناصر مبدئيًا كلها صفر أو قيم افتراضية بحسب النوع.


أنواع المتجهات الأساسية في R

رغم أن الفكرة العامة واحدة، إلا أن الأنواع الأساسية للمتجهات مهمة جدًا لأنها تؤثر على العمليات التي تستطيع تنفيذها.

1. Numeric Vector

هو المتجه الذي يحتوي على أرقام عشرية أو صحيحة.

prices <- c(100, 250.5, 320, 89.99)

2. Integer Vector

يحتوي على أعداد صحيحة بشكل صريح.

ages <- c(20L, 25L, 30L)

الـ L بعد الرقم يجعل القيمة من نوع integer بدل numeric.

3. Character Vector

يحتوي على نصوص.

names <- c("Hassan", "Amina", "Youssef")

4. Logical Vector

يحتوي على قيم منطقية TRUE و FALSE.

passed <- c(TRUE, FALSE, TRUE)

5. Complex Vector

يحتوي على أعداد مركبة.

z <- c(2+3i, 5+1i)
z

هذا النوع أقل استخدامًا في الأعمال اليومية، لكنه موجود ويدعمه R.


كيف تتصرف R عند خلط الأنواع داخل متجه؟

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

مثال:

mixed <- c(1, "two", 3)
mixed

النتيجة ستكون متجهًا نصيًا، لأن النصوص لا يمكن تحويلها إلى أرقام بشكل تلقائي في هذا السياق، فتقوم R بتحويل الأرقام إلى نصوص.

ومثال آخر:

mixed2 <- c(TRUE, 1, 0)
mixed2

سيتم تحويل القيم المنطقية إلى أرقام غالبًا، لأن numeric أوسع من logical.

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


خصائص المتجهات في R

كل متجه في R له خصائص مهمة، منها الطول والنوع.

معرفة طول المتجه

x <- c(5, 10, 15, 20, 25)
length(x)

الطول هنا هو عدد العناصر داخل المتجه.

معرفة نوع المتجه

typeof(x)

هذا يخبرك بالنوع الداخلي للقيم، مثل "double" أو "character" أو "logical".

معرفة البنية العامة

str(x)

الدالة str() مفيدة جدًا لأنها تعرض لك لمحة سريعة عن هيكل المتجه أو حتى أي كائن آخر في R. وهذه عادة ممتازة أثناء التعلم والتصحيح.


الوصول إلى عناصر المتجه: الفهرسة Indexing

واحدة من أكثر المهارات أهمية عند العمل مع المتجهات هي معرفة كيف تصل إلى عنصر محدد أو مجموعة عناصر. في R، الفهرسة تبدأ من 1 وليس 0، وهذه نقطة مهمة جدًا للمبتدئين القادمين من لغات أخرى.

الوصول إلى عنصر واحد

x <- c(10, 20, 30, 40, 50)
x[1]

هذا يعيد أول عنصر.

x[3]

هذا يعيد العنصر الثالث.

الوصول إلى أكثر من عنصر

x[c(1, 3, 5)]

هذا يعيد العناصر الأولى والثالثة والخامسة.

استبعاد عناصر معينة

x[-2]

هذا يعيد كل العناصر ما عدا العنصر الثاني.

الوصول إلى نطاق من العناصر

x[2:4]

هذا يعيد العناصر من الثاني إلى الرابع.

هذه الأدوات بسيطة لكنها قوية جدًا، وستستعملها باستمرار في تنظيف وتحليل البيانات.


الفهرسة باستخدام القيم المنطقية

واحدة من أجمل نقاط القوة في R هي إمكانية استخدام متجه منطقي لاختيار عناصر من متجه آخر.

scores <- c(55, 72, 88, 40, 91)
scores[scores > 60]

النتيجة هي كل القيم التي تزيد عن 60.

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

مثال آخر:

scores[scores >= 80]

وهذا يعيد الدرجات العالية فقط.


تسمية عناصر المتجه

يمكنك إعطاء أسماء لعناصر المتجه، وهذا مفيد جدًا عندما تريد أن تجعل البيانات أكثر وضوحًا.

scores <- c(Ahmed = 90, Sara = 85, Omar = 78)
scores

أو:

names(scores) <- c("Ahmed", "Sara", "Omar")
scores

بعد ذلك يمكنك الوصول إلى عنصر بالاسم:

scores["Sara"]

وهذا يجعل الكود أوضح خصوصًا عندما تكون البيانات تمثل أشخاصًا أو منتجات أو أقسامًا أو أي كائنات لها أسماء منطقية.


تعديل عناصر المتجه

يمكنك تعديل عنصر أو أكثر بسهولة شديدة.

x <- c(10, 20, 30, 40)
x[2] <- 99
x

الآن أصبح العنصر الثاني 99 بدل 20.

ويمكنك تعديل أكثر من عنصر دفعة واحدة:

x[c(1, 4)] <- c(100, 400)
x

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


التكرار داخل المتجهات

إذا أردت تكرار قيمة أو متجه، فهناك دالتان شائعتان جدًا: rep() و each.

تكرار قيمة معينة عدة مرات

rep(5, times = 4)

هذا يعيد 5 أربع مرات.

تكرار مجموعة قيم

rep(c(1, 2, 3), times = 2)

النتيجة ستكون تكرار المتجه كله مرتين.

تكرار كل عنصر عددًا معينًا من المرات

rep(c(1, 2, 3), each = 2)

هذا يكرر كل قيمة مرتين قبل الانتقال إلى القيمة التالية.

هذه الدالة مهمة جدًا في بناء البيانات التجريبية أو إنشاء أنماط متكررة أو المحاكاة.


إنشاء متجهات متسلسلة

إذا أردت إنشاء تسلسل عددي، فالدالة : مفيدة جدًا.

1:10

هذا ينشئ متجهًا من 1 إلى 10.

لكن أحيانًا تحتاج دقة أكبر في عدد العناصر أو الخطوة، وهنا تأتي seq().

seq(1, 10, by = 2)

هذا يعيد 1، 3، 5، 7، 9.

ويمكنك أيضًا التحكم في عدد العناصر:

seq(0, 1, length.out = 5)

وهذا مفيد جدًا في الرسوم البيانية أو التجارب أو تقسيم القيم.


العمليات الحسابية على المتجهات

واحدة من أقوى ميزات R هي أنها تطبق العمليات الحسابية على المتجهات عنصرًا بعنصر بشكل تلقائي.

a <- c(1, 2, 3)
b <- c(10, 20, 30)
a + b

النتيجة:

  • 1 + 10

  • 2 + 20

  • 3 + 30

وهكذا.

يمكنك أيضًا استخدام:

a * 2

فيتم ضرب كل عنصر في 2.

هذه الفكرة تسمى vectorized operations، وهي من أهم أسباب سرعة R وسهولة استخدامها في التحليل.

جمع، طرح، ضرب، قسمة

x <- c(5, 10, 15)
x + 5
x - 2
x * 3
x / 5

الأس

x^2

الجذر التربيعي

sqrt(x)

اللوغاريتم

log(x)

القيم المطلقة

abs(c(-5, 3, -10))

كل هذه العمليات تعمل بشكل متجهِي مباشر دون الحاجة إلى loop في أغلب الحالات.


قاعدة إعادة التدوير Recycling Rule

هنا توجد نقطة مهمة جدًا يجب أن يفهمها كل من يعمل مع R. إذا كان طول متجهين مختلفًا وكنت تنفذ عملية بينهما، فقد تستخدم R ما يسمى recycling rule. أي أنها تعيد تدوير القيم القصيرة لتناسب طول المتجه الأطول.

c(1, 2, 3, 4) + c(10, 20)

ستقوم R بإعادة تدوير 10, 20 لتصبح:

  • 10, 20, 10, 20

ثم تنفذ الجمع.

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


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

في عالم R، كثير من التحليلات تبدأ بمتجه بسيط. ثم تستخدم عليه دوال إحصائية أساسية مثل:

x <- c(10, 20, 30, 40, 50)
sum(x)
mean(x)
median(x)
min(x)
max(x)
range(x)
sd(x)
var(x)

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

مثال عملي

scores <- c(72, 85, 90, 64, 88, 95, 78)
mean(scores)
median(scores)
sd(scores)

عندما تتعامل مع بيانات حقيقية، مثل درجات الطلاب أو أسعار المنتجات أو قيم الاستجابة، فإن هذه الدوال تعطيك صورة أولية جيدة جدًا عن توزيع القيم.


التعامل مع القيم الناقصة NA

في البيانات الواقعية، القيم الناقصة أمر لا مفر منه تقريبًا. وهنا يجب أن تتعلم كيف يتعامل R معها داخل المتجهات.

x <- c(10, NA, 30, 40)

إذا طبعت x سترى أن القيمة الثانية مفقودة.

التحقق من وجود NA

is.na(x)

يعيد متجهًا منطقيًا يوضح أين توجد القيم المفقودة.

حساب المتوسط مع تجاهل NA

mean(x, na.rm = TRUE)

بدون na.rm = TRUE قد تحصل على NA كناتج، لأن وجود قيمة ناقصة قد يمنع الحساب الكامل.

هذا من أكثر الأمور شيوعًا في R، ويجب التعامل معه بعناية. لأن تجاهل NA أحيانًا قد يكون مطلوبًا، وأحيانًا أخرى قد يخفي مشكلة في البيانات نفسها.


تصفية المتجهات

عندما تريد استخراج عناصر معينة بناءً على شرط، فإن الفكرة بسيطة جدًا:

ages <- c(15, 18, 21, 14, 30, 25)
ages[ages >= 18]

هذا يعيد كل الأعمار البالغة.

يمكنك أيضًا استخدام شروط مركبة:

ages[ages >= 18 & ages <= 25]

أو:

scores <- c(45, 60, 75, 90, 100)
scores[scores > 50 & scores < 95]

هذه الطريقة أساسية جدًا في تنظيف البيانات وتحديد الفئات المستهدفة.


الترتيب Sorting

عندما يكون لديك متجه وتريد ترتيبه:

x <- c(50, 10, 40, 20, 30)
sort(x)

النتيجة ستكون من الأصغر إلى الأكبر.

وإذا أردت الترتيب التنازلي:

sort(x, decreasing = TRUE)

يمكنك أيضًا معرفة ترتيب العناصر الأصلية:

order(x)

وهذا مفيد إذا كنت تريد ترتيب بيانات أخرى بناءً على المتجه نفسه.


البحث عن القيم المكررة

أحيانًا تحتاج إلى معرفة العناصر المتكررة داخل المتجه.

x <- c(1, 2, 2, 3, 4, 4, 4, 5)
duplicated(x)

هذا يعيد متجهًا منطقيًا يوضح العناصر المكررة.

وللحصول على القيم الفريدة:

unique(x)

هذه الأدوات مهمة جدًا في تنظيف البيانات، خاصة عندما تعمل على قوائم أسماء أو رموز أو معرّفات.


دمج المتجهات

يمكنك دمج متجهين أو أكثر باستخدام c().

v1 <- c(1, 2, 3)
v2 <- c(4, 5, 6)
combined <- c(v1, v2)
combined

وهذا يعطي متجهًا أطول يحتوي على جميع القيم.

لكن انتبه إلى النوع. إذا جمعت نصوصًا مع أرقام، فقد يتم التحويل إلى نوع موحد كما ذكرنا سابقًا.


المتجهات والأسماء Names

من الخصائص الجميلة في R أن المتجه يمكن أن يحمل أسماء لعناصره. هذه الأسماء ليست عنصرًا منفصلًا في المعنى الكامل، لكنها تجعل التعامل مع القيم أوضح.

sales <- c(Jan = 1000, Feb = 1200, Mar = 900)
names(sales)

وللتعامل مع الأسماء:

sales["Feb"]

يمكنك تعديل الأسماء أيضًا:

names(sales) <- c("January", "February", "March")
sales

في مشاريع التحليل، هذه الميزة مفيدة جدًا عندما يكون لديك متجه يمثل شيئًا ذا معنى، مثل شهور السنة أو أسماء الفروع أو نتائج الاستبيان.


المتجهات والمنطق Boolean Logic

المتجهات المنطقية ليست مجرد نوع بيانات آخر، بل هي أساس الفلترة والاختيار الشرطي.

x <- c(10, 20, 30, 40)
x > 25

النتيجة:

  • FALSE

  • FALSE

  • TRUE

  • TRUE

هذا المتجه المنطقي يمكن استخدامه لاحقًا لاختيار القيم.

x[x > 25]

الجميل هنا أن R تتيح لك التفكير بطريقة طبيعية جدًا: “أعطني القيم التي تحقق هذا الشرط”. وهذا يختصر الكثير من الشيفرة.


الدوال المنطقية الأساسية على المتجهات

عندما تتعامل مع الشروط، ستحتاج كثيرًا إلى:

  • & : و

  • | : أو

  • ! : نفي

مثال:

x <- c(5, 10, 15, 20, 25)
x > 10 & x < 25

هذا يعيد القيم التي تقع بين 10 و25.

أما:

x < 10 | x > 20

فيعطيك القيم الأصغر من 10 أو الأكبر من 20.

هذه الأدوات مهمة جدًا، وستجدها في أغلب مشاريع التحليل والتنقيب عن البيانات.


الدالة which()

عندما تريد معرفة مواقع القيم التي تحقق شرطًا معينًا، استخدم which().

scores <- c(50, 80, 90, 60, 95)
which(scores > 75)

هذا يعيد الفهارس التي تحقق الشرط، وليس القيم نفسها.

هذا مفيد عندما تحتاج إلى معرفة مكان العناصر بدل العناصر ذاتها.


all() و any()

دالتان مهمتان جدًا مع المتجهات المنطقية.

all()

تعيد TRUE إذا كانت كل القيم تحقق الشرط.

x <- c(10, 20, 30)
all(x > 5)

any()

تعيد TRUE إذا كانت قيمة واحدة على الأقل تحقق الشرط.

any(x > 25)

هذه الدوال مفيدة جدًا في كتابة شروط عامة أو في التحقق من صحة البيانات.


كيفية التعامل مع المتجهات داخل data frames

رغم أن موضوعنا الأساسي هو المتجهات، لا يمكن تجاهل أن كثيرًا من الأعمدة داخل data.frame في R تكون في جوهرها متجهات.

students <- data.frame(
  name = c("Ali", "Sara", "Omar"),
  grade = c(88, 92, 79),
  passed = c(TRUE, TRUE, TRUE)
)

هنا كل عمود هو متجه. عمود name متجه نصي، وgrade متجه عددي، وpassed متجه منطقي.

يمكنك الوصول إلى عمود واحد كمتجه:

students$grade

ثم تطبيق العمليات عليه:

mean(students$grade)
students$grade[students$grade > 80]

فهمك للمتجهات هنا يجعلك تفهم data frames بسهولة أكبر، لأنك ستدرك أن الكثير من عمليات الجدولة والتحليل مبنية في الأصل على متجهات مستقلة.


المتجهات والمصفوفات Matrices

المصفوفة في R هي في الحقيقة نوع خاص من المتجهات، لكنها ثنائية الأبعاد. أي أنها تعتمد على فكرة المتجه، ثم تضيف عليها الصفوف والأعمدة.

m <- matrix(c(1, 2, 3, 4, 5, 6), nrow = 2)
m

إذا فهمت المتجهات جيدًا، فستفهم المصفوفات بسهولة أيضًا، لأنك هنا فقط غيّرت طريقة العرض والتنظيم.


بناء متجهات عملية لمشروع تحليلي

لنفترض أنك تعمل على تحليل درجات طلاب في اختبار.

scores <- c(72, 85, 90, 64, 88, 95, 78, 81, 69, 100)

حساب المتوسط

mean(scores)

معرفة الدرجات الناجحة

scores[scores >= 70]

معرفة أعلى درجة

max(scores)

معرفة أقل درجة

min(scores)

ترتيب الدرجات

sort(scores)

استخراج المواقع الأعلى من 90

which(scores > 90)

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


مثال عملي آخر: متجه مبيعات شهري

sales <- c(12000, 15000, 9800, 11000, 14500, 16000, 17000, 15800, 14900, 18000, 19000, 21000)

متوسط المبيعات الشهرية

mean(sales)

إجمالي المبيعات

sum(sales)

أشهر المبيعات الأعلى من المتوسط

sales[sales > mean(sales)]

ترتيب الأشهر حسب المبيعات

إذا أضفت أسماء للأشهر:

names(sales) <- c("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec")
sales

ثم:

sort(sales, decreasing = TRUE)

هذا النوع من التحليل هو بداية ممتازة لفهم البيانات المالية أو التسويقية أو التشغيلية.


استخدام المتجهات في التكرار والمحاكاة

المتجهات مفيدة جدًا في المحاكاة. مثلًا إذا أردت إنشاء عيّنات عشوائية:

sample(c("A", "B", "C"), size = 10, replace = TRUE)

أو أرقام عشوائية:

runif(5, min = 0, max = 1)
rnorm(5, mean = 0, sd = 1)

الناتج هنا سيكون متجهًا. وهذا يوضح أن المتجهات ليست فقط للتخزين، بل أيضًا للإخراج الطبيعي للعمليات الإحصائية.


التعامل مع سلاسل الزمن كمتجهات

كثير من بيانات الوقت يمكن تمثيلها في R باستخدام متجهات بسيطة. مثل درجات الحرارة اليومية، أو عدد الزوار، أو الأسعار.

temperatures <- c(21.5, 22.0, 23.1, 24.8, 25.0, 23.9, 22.7)

يمكنك حساب:

mean(temperatures)
max(temperatures)
min(temperatures)
temperatures > 24

ومع الوقت قد تتحول هذه المتجهات إلى series أو ts objects، لكن البداية غالبًا تكون من متجه بسيط جدًا.


أخطاء شائعة عند التعامل مع المتجهات

هناك مجموعة أخطاء يكررها المبتدئون باستمرار، ومن الجيد أن تنتبه لها مبكرًا.

1. خلط الأنواع دون قصد

x <- c(1, 2, "3")

هنا قد يتحول المتجه بالكامل إلى نصوص.

2. نسيان أن الفهرسة تبدأ من 1

x[0]

في R، هذا ليس أول عنصر، بل قد يعني شيئًا مختلفًا حسب السياق، لذلك يجب الحذر.

3. تجاهل NA

mean(c(1, 2, NA, 4))

قد يعطيك NA إذا لم تستخدم na.rm = TRUE.

4. عدم الانتباه إلى recycling

c(1, 2, 3, 4) + c(10, 20)

قد ينتج نتيجة غير مقصودة إذا لم تكن تنتبه للأطوال.

5. الاعتماد على التحويل القسري

إذا حولت نصًا إلى رقم ولم يكن صالحًا، قد تحصل على NA.

as.numeric("abc")

النتيجة ستكون NA مع تحذير.


تحويل المتجهات بين الأنواع

R توفر دوال تحويل واضحة جدًا.

x <- c("1", "2", "3")
as.numeric(x)

أو:

as.character(c(1, 2, 3))

أو:

as.logical(c(1, 0, 1))

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


بناء دالة بسيطة تعمل على متجه

من الممارسات الجيدة في R أن تكتب دوال تعمل على المتجهات مباشرة.

double_values <- function(x) {
  x * 2
}

double_values(c(1, 2, 3, 4))

هذه الفكرة مهمة جدًا لأن دوال R غالبًا تستفيد من الطبيعة المتجهية للغة. بدل أن تمر على كل عنصر في حلقة، يمكن للدالة أن تعمل على المتجه كله دفعة واحدة.

مثال آخر:

safe_mean <- function(x) {
  mean(x, na.rm = TRUE)
}

التعامل مع السلاسل النصية كمتجهات

في R، النصوص أيضًا تُعامل كمتجهات. وهذا مفيد جدًا عند العمل مع الأسماء أو الرسائل أو الرسائل البريدية أو الفئات.

cities <- c("Rabat", "Fes", "Tangier")
toupper(cities)
tolower(cities)
nchar(cities)

يمكنك أيضًا التحقق من تطابق نص معيّن:

grepl("a", cities)

والعامل النصي أيضًا يتبع الطبيعة المتجهية في R، لذلك ستجد أنه يعمل على كل عنصر على حدة.


المتجهات في التحليل الحقيقي

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

  • عمود الأعمار

  • عمود الأسعار

  • عمود التواريخ بعد تحويلها

  • عمود أسماء العملاء

  • عمود القيم المنطقية مثل status

  • عمود التقييمات

  • عمود النتائج

  • عمود المقاييس

فهمك للمتجهات يجعلك تقرأ البيانات على مستوى أعمق، لأنك لن ترى الأعمدة فقط، بل سترى كل عمود كمتجه يمكن تحليله بشكل مستقل أو مع غيره.


مثال تطبيقي شامل

لنفترض أن لدينا بيانات مبيعات بسيطة:

products <- c("Laptop", "Phone", "Tablet", "Monitor", "Keyboard")
prices <- c(1200, 800, 450, 300, 100)
sold <- c(12, 25, 18, 9, 40)

حساب الإيراد لكل منتج

revenue <- prices * sold
revenue

معرفة المنتج الأعلى إيرادًا

products[which.max(revenue)]

ترتيب المنتجات حسب الإيراد

revenue_sorted <- sort(revenue, decreasing = TRUE)
revenue_sorted

ربط الأسماء بالإيرادات

names(revenue) <- products
revenue

عرض المنتجات التي تجاوزت مبيعاتها 15 وحدة

products[sold > 15]

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


نصائح ذهنية لفهم المتجهات بسهولة

إذا كنت في بداية تعلم R، فهناك طريقة جميلة لتسهيل الفهم. لا تتعامل مع المتجه كمفهوم صعب أو مجرد مصطلح تقني. فكر فيه كـ “صف من القيم المرتبة”. هذا التبسيط يساعدك كثيرًا. وعندما تصبح مرتاحًا معه، ستفهم أن R لا تحب أن تعمل على قيمة منفردة فقط، بل على صفوف كاملة من القيم في وقت واحد.

ومن المفيد أيضًا أن تكتب أمثلة صغيرة بنفسك بدل القراءة فقط. أنشئ متجهًا من 5 أو 10 عناصر، ثم جرّب عليه الجمع، والترتيب، والفهرسة، والفلترة، والتعديل. هذه التجارب الصغيرة تترسخ في الذاكرة أسرع بكثير من الشرح النظري وحده.


خلاصة مهمة

التعامل مع المتجهات في لغة R هو أحد المفاتيح الكبرى لفهم اللغة كلها. إذا فهمت المتجهات، ستفهم العمليات الحسابية، والفهرسة، والفلاتر، والقيم الناقصة، والتحويلات، وحتى كثيرًا من بنيات البيانات الأخرى مثل المصفوفات وdata frames. R ليست لغة تُفهم بالمصادفة، بل بلغة تتكشف قوتها شيئًا فشيئًا عندما تبدأ في رؤية الأشياء كما تراها هي: مجموعة من القيم تُدار بطريقة متجهية.

ولهذا السبب، لا تتعجل في الانتقال من المتجهات إلى موضوعات أكثر تعقيدًا قبل أن تشعر بالراحة معها. جرّب إنشاء المتجهات، وتعديلها، وترتيبها، وفلترتها، واستخدمها في حسابات بسيطة، ثم في أمثلة أقرب إلى الواقع. ستكتشف مع الوقت أن معظم العمل الجميل في R يبدأ من هنا، من هذا المفهوم البسيط الذي يبدو صغيرًا لكنه في الحقيقة أساسي جدًا.

وإذا أخذت هذه الفكرة بجدية، فستجد أن تعلم R يصبح أسهل وأمتع وأكثر منطقية. لأنك لن تتعامل مع اللغة كمجموعة أوامر منفصلة، بل كنظام متكامل يبني كل شيء تقريبًا فوق المتجهات. وهذا هو السر الذي يجعل R قوية ومحبوبة في عالم تحليل البيانات.

#R vectors #المتجهات في R #التعامل مع vectors في R #لغة R #برمجة R #data types in R #vector indexing #vector operations in R #R tutorial #تعليم R #تحليل البيانات في R #numeric vector #character vector #logical vector #recycle rule