R: متجهات R: هياكل البيانات الأساسية في البرمجة بلغة R
آخر تحديث: 2026-08-26
في الدرس السابق، تعرفنا على أنواع البيانات الستة في لغة R. وفي هذا الدرس، سنبدأ في استكشاف بنية البيانات الأساسية في لغة R، وهي المتجهات. في لغة Python، يؤدي كتابة
1, 2, 3إلى إرجاع ثلاثة أرقام منفصلة؛ ولإدراجها في قائمة، عليك كتابة[1, 2, 3]. لكن لغة R مختلفة — في لغة R،1, 2, 3يُعتبر متجهًا على الفور.
تُعد المتجهات في لغة R حجر الزاوية في اللغة بأكملها: فالأرقام والسلاسل والقيم المنطقية كلها متجهات. في هذا الدرس، سنتعمق في موضوع المتجهات، حيث ستظهر في كود كل درس لاحق.
1. ما ستتعلمه
- ما هو متجه R، ولماذا يعتبر عنصراً أساسياً في لغة R؟
- 4 طرق لإنشاء متجهات (c() / : / seq() / rep())
- 5 طرق للوصول إلى عناصر المتجهات (الأعداد الصحيحة الموجبة/السالبة، القيم المنطقية، الأسماء)
- العمليات الحسابية على المتجهات (عدد قياسي + متجه، متجه + متجه)
- 9 دوال تجميعية شائعة (المجموع، المتوسط، الانحراف المعياري، إلخ)
- العمليات الشائعة للفرز وإزالة التكرارات والبحث
2. قصة حول إدارة درجات الطلاب
(1) خلفية البعثة
إيفان هو مدرس الفصل، وعند نهاية الفصل الدراسي، عليه أن يحسب مجموع درجات جميع الطلاب البالغ عددهم 30 طالبًا في فصله. وعليه القيام بما يلي:
- حساب متوسط الدرجات، وأعلى درجة، ونسبة النجاح
- تحديد الطلاب الذين حصلوا على 90 درجة أو أكثر
- ترتيب الدرجات من الأعلى إلى الأدنى
- تعيين درجة لكل نتيجة (ممتاز/جيد/ناجح/راسب)
لو استخدم برنامج «إكسل»، لكان عليه النسخ واللصق مرارًا وتكرارًا + استخدام الجداول المحورية. ولو استخدم لغة «بايثون»، لكان عليه كتابة قوائم، وحلقات، وتعبيرات القوائم. لكن باستخدام لغة «آر»—
(2) الحل باستخدام لغة R
# One-Line Code Generation 30 Student Grades (From 50 to 100 Random)
set.seed(42)
scores <- sample(50:100, 30, replace = TRUE)
# All statistics in a single line of code
mean(scores) # Average Score
max(scores) # Highest Score
sum(scores >= 60) / length(scores) # Pass Rate
scores[scores >= 90] # 90 Points or more
sort(scores, decreasing = TRUE) # Sort in descending order
10 أسطر من التعليمات البرمجية لحل 5 مهام. هذا هو جمال المتجهات في لغة R — معالجة عمود من البيانات بأقل قدر ممكن من التعليمات البرمجية.
3. ما هو المتجه؟
المتجه هو بنية البيانات الأساسية في لغة R؛ وهو عبارة عن مجموعة مرتبة من العناصر من نفس النوع.
(1) طبيعة المتجهات
graph LR
A["R Vector"] --> B["Atomicity<br/>A single digit = Length1the vector"]
A --> C["Homogeneity<br/>All elements are of the same type"]
A --> D["Orderliness<br/>Index by Location 1-based"]
A --> E["Vectorization<br/>Operations are performed automatically on a per-element basis"]
style A fill:#fff3cd
style B fill:#cce5ff
style C fill:#d4edda
style D fill:#f8d7da
style E fill:#e1d4ff
(2) المتجهات R مقابل قوائم Python
| السمة | متجه R c(1,2,3) |
قائمة بايثون [1,2,3] |
|---|---|---|
| نوع العنصر | يجب أن يكون متطابقًا | يمكن أن يكون مختلفًا |
| طول متغير | ❌ ثابت | ✅ متغير (إضافة/حذف) |
| العمليات الحسابية | التحويل التلقائي إلى متجهات | يتطلب استخدام تعبيرات القوائم |
| طريقة الفهرسة | x[1] (تبدأ من 1) |
x[0] (تبدأ من 0) |
| الأداء | لغة C من المستوى المنخفض، سريع | كائنات عامة، بطيء |
# Mixed Types:Mixing Numbers and Strings → Convert All to Strings
c(1, "a", TRUE)
# [1] "1" "a" "TRUE"
(3) لا يوجد مصطلح «Scalar» في لغة R
تتمتع المتجهات R بخاصية خفية: العدد الفردي هو أيضًا متجه طوله 1.
x <- 42
length(x)
# [1] 1
# That's why R All operations are, by default, "Vectorization"
c(1, 2, 3) + 10
# [1] 11 12 13
4. 4 طرق لإنشاء متجهات
(1) نظرة عامة على طرق الإنشاء
| الطريقة | الصيغة | حالات الاستخدام |
|---|---|---|
c() |
c(1, 2, 3) |
إدراج بعض الأرقام يدويًّا (الأكثر استخدامًا) |
: |
1:5 |
متتابعة من الأعداد الصحيحة المتتالية |
seq() |
seq(1, 10, 2) |
المتتابعة الحسابية |
rep() |
rep(1:3, times = 2) |
العناصر المكررة |
| تسلسل السلاسل |
(2) مقارنة بين الطرق المختلفة
# 1. c() —— concatenate(Connect),Most Commonly Used
c(10, 20, 30, 40, 50)
# [1] 10 20 30 40 50
# 2. : —— Colon Operator,Consecutive integers
1:5
# [1] 1 2 3 4 5
5:1
# [1] 5 4 3 2 1 ← Reverse Sequence
# 3. seq() —— Arithmetic Sequence
seq(from = 1, to = 10, by = 2)
# [1] 1 3 5 7 9
seq(from = 0, to = 1, length.out = 5)
# [1] 0.00 0.25 0.50 0.75 1.00
# 4. rep() —— Duplicate Elements
rep(x = 1:3, times = 2)
# [1] 1 2 3 1 2 3 ← The entire vector is repeated 2 x
rep(x = 1:3, each = 2)
# [1] 1 1 2 2 3 3 ← Repeat each element 2 x
# 5. paste() —— String Concatenation
paste("Rank", 1:3, "th")
# [1] "Rank 1 th" "Rank 2 th" "Rank 3 th"
(3) متجهات السلاسل ووظيفة paste()
# paste Default sep = " "(Space)
paste("Hello", "World")
# [1] "Hello World"
# paste0 = paste(..., sep = "") No separators
paste0("Hello", "World")
# [1] "HelloWorld"
# Vectorized Concatenation
paste(c("a", "b", "c"), 1:3, sep = "-")
# [1] "a-1" "b-2" "c-3"
paste() وpaste0() هو أن paste0() يُعيَّن افتراضيًّا إلى sep = ""، لذا فإنك تكتب عددًا أقل من الأحرف وتكون أسرع بنسبة 30٪.
5. 5 طرق للوصول إلى عناصر المتجهات
(1) نظرة عامة على طرق الوصول
| الطريقة | الصيغة | المعنى |
|---|---|---|
| مؤشر صحيح موجب | x[1] |
استرجاع العنصر الأول (يبدأ الترقيم من 1) |
| مؤشر عدد صحيح سالب | x[-1] |
استبعاد الأول |
| فهارس متعددة | x[c(1, 3)] |
خذ الأول والثالث |
| الفهرس المنطقي | x[x > 5] |
استرجاع العناصر الأكبر من 5 |
| فهرس الأسماء | x["Bob"] |
حسب الاسم |
(2) ⚠️ ملاحظة مهمة: الترقيم في R يبدأ من 1
x <- c("a", "b", "c", "d", "e")
x[1] # 1st element
# [1] "a"
x[0] # <- Error! Empty vector, no "a"
# numeric(0)
x[c(1, 3, 5)] # Multiple indexes
# [1] "a" "c" "e"
x[0]، مما يؤدي إلى إرجاع متجه فارغ بدلاً من العنصر الأول.
(3) الفهارس الصحيحة السالبة (باستثناء العناصر)
x <- c("a", "b", "c", "d", "e")
x[-1] # Exclusion No. 1 ea
# [1] "b" "c" "d" "e"
x[-c(1, 3)] # Exclusion No. 1 and No. 3 ea
# [1] "b" "d" "e"
(4) الفهرس المنطقي (الأقوى)
هذه هي أقوى طريقة للفهرسة في لغة R:
x <- c(10, 20, 30, 40, 50)
# Find the number greater than 30 the element
x[x > 30]
# [1] 40 50
# Find the even numbers
x[x %% 2 == 0]
# [1] 10 20 30 40 50
# Multiple conditions (& indicates "and", | indicates "or")
x[x > 20 & x < 50]
# [1] 30 40
x[logical vector]، حيث يتم الاحتفاظ بالمواضع التي تحتوي على TRUE، ويتم استبعاد المواضع التي تحتوي على FALSE.
(5) الفهارس المسماة
حدد عناصر المتجه، ثم قم بالوصول إليها باستخدام أسمائها:
scores <- c(Alice = 85, Bob = 92, Charlie = 78)
scores
# Alice Bob Charlie
# 85 92 78
scores["Bob"]
# Bob
# 92
6. العمليات المتجهة: التحويل التلقائي إلى متجهات
(1) ما المقصود بـ«التوجيه»؟
graph LR
A["x = 1, 2, 3"] --> C["+ 100"]
C --> D["101, 102, 103"]
E["x = 1, 2, 3"] --> F["+ y = 10, 20, 30"]
F --> G["11, 22, 33"]
style A fill:#cce5ff
style E fill:#cce5ff
style C fill:#fff3cd
style F fill:#d4edda
style D fill:#d4edda
style G fill:#d4edda
يتم «تحويل العمليات الحسابية في R إلى صيغة متجهة» بشكل افتراضي — دون الحاجة إلى كتابة حلقات.
(2) متجه + عدد ثابت (توزيع العدد الثابت)
x <- c(1, 2, 3, 4, 5)
x + 100 # 100 Broadcast to each element
# [1] 101 102 103 104 105
x * 10
# [1] 10 20 30 40 50
(3) متجه + متجه (عملية على مستوى العناصر)
x <- c(1, 2, 3, 4, 5)
y <- c(10, 20, 30, 40, 50)
x + y
# [1] 11 22 33 44 55
x * y
# [1] 10 40 90 160 250
numpy أو تعبير قائمة، بينما في لغة R، يمكن القيام بذلك في سطر واحد.
(4) ستحدث «تكرار» عندما تكون الأطوال مختلفة
c(1, 2, 3, 4) + c(10, 20)
# Warning: longer object length is not a multiple of shorter object length
# [1] 11 22 13 24
# The Second Vector Loop:[10, 20, 10, 20]
(5) الدوال الرياضية الشائعة (جميعها مُعالجة بشكل متجهي)
| الوظيفة | الغرض | مثال |
|---|---|---|
abs() |
القيمة المطلقة | abs(c(-1, -2, 3)) → 1 2 3 |
| الجذر التربيعي | sqrt() |
→ sqrt(c(1, 4, 9)) |
| اللوغاريتم الطبيعي | → | |
| التجميع | round() |
|
floor() ceiling() |
التقريب لأسفل/لأعلى | floor(1.6) → 1 |
7. دوال التجميع: دمج المتجهات في قيمة واحدة
| الوظيفة | الغرض | مثال |
|---|---|---|
sum() |
المجموع | sum(1:5) → 15 |
mean() |
القيمة المتوسطة | mean(1:5) → 3 |
median() |
الوسيط | median(1:5) → 3 |
min() max() |
الحد الأدنى الحد الأقصى | max(1:5) → 5 |
sd() |
الانحراف المعياري | sd(1:5) → 1.581 |
var() |
التباين | var(1:5) → 2.5 |
length() |
الطول | length(1:5) → 5 |
prod() |
المنتج | prod(1:5) → 120 |
na.rm = TRUE لتخطي القيم NA:mean(c(1, 2, NA), na.rm = TRUE) → 1.5
8. العمليات الشائعة: الفرز، وإزالة التكرارات، والبحث
(1) جدول مرجعي سريع للعمليات الثلاث الرئيسية
| الفئة | الوظيفة | الغرض |
|---|---|---|
| الفرز | sort(x) |
متجه مُرتب |
| ترتيب الفرز | order(x) |
موضع الفهرس بعد الفرز |
| الفرز | rev(x) |
متجه عكسي |
| إزالة التكرارات | unique(x) |
القيم الفريدة |
| إزالة التكرارات | table(x) |
إحصائيات التكرار |
| مجموعة | union(a, b) |
الاتحاد |
| مجموعة | intersect(a, b) |
تقاطع |
| مجموعة | setdiff(a, b) |
مجموعة الفروق |
| بحث | match("a", x) |
أول ظهور |
| بحث | "a" %in% x |
هل يحتوي على العنصر؟ |
(2) المفتاح: order() مقابل sort()
x <- c(3, 1, 4, 1, 5, 9, 2, 6)
# sort() Return a sorted vector
sort(x)
# [1] 1 1 2 3 4 5 6 9
# order() Return the sorted**Index**
order(x)
# [1] 2 4 7 1 3 8 6 5
# Meaning: x's 2nd element is the smallest and comes first, the 4th is the second smallest... After sorting x[order(x)] = sort(x)
order() شائعة جدًّا عند فرز إطارات البيانات: df[order(df$age), ] تقوم بالفرز حسب العمر بترتيب تصاعدي.
9. مثال كامل: إحصائيات درجات الطلاب
فيما يلي مثال على مسار عمل كامل يربط بين جميع المفاهيم التي تم تناولها في هذا الدرس.
▶ مثال: تحليل شامل لدرجات 30 طالبًا
# ============================================
# Comprehensive Analysis of Student Performance
# Features: Create a grade vector, do 5 Statistics by Type
# ============================================
# 1. Create 5 Student Grades(Name Vector)
scores <- c(Alice = 85, Bob = 92, Charlie = 78, David = 95, Eve = 88)
cat("Raw Scores:\n")
print(scores)
# 2. Basic Statistics
cat("\n=== Basic Statistics ===\n")
cat("Total Score:", sum(scores), "\n")
cat("Average Score:", mean(scores), "\n")
cat("Median:", median(scores), "\n")
cat("Highest Score:", max(scores), "\n")
cat("Lowest score:", min(scores), "\n")
cat("Standard Deviation:", round(sd(scores), 2), "\n")
# 3. Find the student with the highest score(Naming Index)
cat("\n=== Top-scoring student ===\n")
print(scores[scores == max(scores)])
# 4. Find 90 Points or more
cat("\n=== 90 Students scoring above a certain score ===\n")
print(scores[scores >= 90])
# 5. Identify the failing grades
cat("\n=== Students who failed(< 60)===\n")
print(scores[scores < 60])
# 6. Sort (descending)
cat("\n=== Sort by score in descending order ===\n")
print(sort(scores, decreasing = TRUE))
# 7. Standardization(z-score:Subtract the mean from all scores, then divide by the standard deviation)
z_scores <- (scores - mean(scores)) / sd(scores)
cat("\n=== Z-Score Standardization ===\n")
print(round(z_scores, 3))
# 8. Rating(Excellent/Good/Passing Grade/Fail)
ratings <- ifelse(scores >= 90, "Excellent",
ifelse(scores >= 80, "Good",
ifelse(scores >= 60, "Passing Grade", "Fail")))
cat("\n=== Rating ===\n")
print(data.frame(Fractions = scores, Rating = ratings))
الناتج المتوقع (مقتطف):
Raw Scores:
Alice Bob Charlie David Eve
85 92 78 95 88
=== Basic Statistics ===
Total Score: 438
Average Score: 87.6
Median: 88
Highest Score: 95
Lowest score: 78
Standard Deviation: 6.19
=== 90 Students scoring above a certain score ===
David
95
=== Sort by score in descending order ===
David Bob Alice Eve Charlie
95 92 85 88 78
=== Z-Score Standardization ===
Alice Bob Charlie David Eve
-0.420 0.711 -1.551 1.197 -0.097
(1) الإجراء
| الخطوة | الإجراء | الوصف |
|---|---|---|
| 1 | إنشاء مشروع RStudio r-vectors |
File → New Project |
| 2 | إنشاء برنامج نصي جديد score_analysis.R |
نسخ الكود أعلاه |
| 3 | تحديد الكل → Ctrl+Enter |
إرسال إلى وحدة التحكم |
| 4 | راقب النتائج | اطلع على 6 نتائج إحصائية |
❓ أسئلة شائعة
x[0] متوقعين استرجاع العنصر الأول، لكنهم ينتهون بمتجه فارغ numeric(0).c(1,2,3,4,5,6) الذي يُعاد تشكيله ليصبح مصفوفة 2×3 يصبح matrix(1:6, nrow = 2)).📖 ملخص
- المتجه هو أبسط بنية بيانات في لغة R: وهو عبارة عن مجموعة مرتبة من عناصر من نفس النوع؛ ولا توجد «قيم عددية» في لغة R — فالرقم الفردي هو ببساطة متجه طوله 1.
- طرق الإنشاء:
c()للأعمدة المباشرة،:للمتتابعات الصحيحة،seq()للمتتابعات الحسابية،rep()للتكرارات؛ استخدمpaste()/paste0()لتسلسل السلاسل - 4 طرق للفهرسة: الأعداد الصحيحة الموجبة (تبدأ من 1،
x[0]هو متجه فارغ)، الأعداد الصحيحة السالبة (الاستبعاد)، المتجهات المنطقية (التصفية)، الفهارس المسماة (حسب الاسم) - يتم تحويل العمليات الحسابية تلقائيًا إلى عمليات متجهة (متجه + عدد قياسي، متجه + متجه)، لذا لا داعي لكتابة حلقات تكرارية؛ كما تُعالج الدوال الرياضية الشائعة (sqrt، log، exp) عنصرًا بعنصر.
- تعمل دوال التجميع (
sum()mean()sd()median()) على دمج المتجهات في قيمة واحدة؛ وتدعم جميعهاna.rm = TRUEلتخطي القيم غير المتوفرة (NA) - استخدم
sort()/order()للفرز (تُرجع الدالة «order» مؤشرًا)، وunique()لإزالة التكرارات، وtable()للتكرار، وunion/intersect/setdiffللمجموعات، وmatch()/%in%للبحث
📝 تمارين
-
المشكلة الأساسية: أنشئ متجهًا من الأعداد الصحيحة من 1 إلى 10 باستخدام ثلاث طرق مختلفة: ①
c()②:③seq()؛ واستخدمidentical()للتحقق من أن نتائج الطرق الثلاث متطابقة تمامًا. التقط لقطة شاشة لإخراج وحدة التحكم واحفظها. -
المشكلة الأساسية: أنشئ متجهًا
x <- c(2, 4, 6, 8, 10)، واستخدم الفهرسة المنطقية لاستخراج العناصر الأكبر من 5، ثم اعرض المتجه الذي تمت تصفيته. احفظ الكود ولقطة شاشة للناتج. -
تمرين أساسي: اجمع
paste()معpaste("Rank", 1:5, "th", sep = "")، وسجل النتيجة؛ ثم اجمعpaste0()معpaste0("x", 1:5, "y")، وسجل النتيجة. التقط لقطة شاشة واحفظها. -
مشكلة متقدمة: قم بمحاكاة درجات 10 طلاب: ① قم بتوليد الدرجات عشوائيًا باستخدام
sample(60:100, 10)؛ ② احسب المتوسط والوسيط وأعلى درجة وأدنى درجة والانحراف المعياري؛ ③ استخدمwhich.max()لإيجاد الترتيب للطالب الحاصل على أعلى درجة؛ ④ احسب عدد الطلاب الناجحين (≥60). احفظ لقطة شاشة لنتائج كل خطوة. -
التحدي: اكتب برنامجًا نصيًّا لمحاكاة سيناريو «توزيع الطلاب على الفصول الدراسية»: ① أنشئ متجهًا
names <- c("Alice", "Bob", ...)يحتوي على أسماء 10 طلاب؛ ② أنشئ متجهًاscores <- sample(60:100, 10)يحتوي على 10 درجات؛ ③ قم بتسميتهnames(scores) <- names؛ ④ ابحث عن أسماء الطلاب الذين حصلوا على 90 درجة أو أكثر؛ ⑤ ابحث عن أسماء الطلاب الذين رسبوا؛ ⑥ قم بفرزها بترتيب تصاعدي واطبعها باستخدامsort(scores). بعد تشغيل البرنامج النصي، التقط لقطة شاشة واحفظ مخرجات وحدة التحكم بالكامل.