R: متجهات R: هياكل البيانات الأساسية في البرمجة بلغة R

آخر تحديث: 2026-08-26

في الدرس السابق، تعرفنا على أنواع البيانات الستة في لغة R. وفي هذا الدرس، سنبدأ في استكشاف بنية البيانات الأساسية في لغة R، وهي المتجهات. في لغة Python، يؤدي كتابة 1, 2, 3 إلى إرجاع ثلاثة أرقام منفصلة؛ ولإدراجها في قائمة، عليك كتابة [1, 2, 3]. لكن لغة R مختلفة — في لغة R، 1, 2, 3 يُعتبر متجهًا على الفور.

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

1. ما ستتعلمه



2. قصة حول إدارة درجات الطلاب

(1) خلفية البعثة

إيفان هو مدرس الفصل، وعند نهاية الفصل الدراسي، عليه أن يحسب مجموع درجات جميع الطلاب البالغ عددهم 30 طالبًا في فصله. وعليه القيام بما يلي:

لو استخدم برنامج «إكسل»، لكان عليه النسخ واللصق مرارًا وتكرارًا + استخدام الجداول المحورية. ولو استخدم لغة «بايثون»، لكان عليه كتابة قوائم، وحلقات، وتعبيرات القوائم. لكن باستخدام لغة «آر»—

(2) الحل باستخدام لغة R

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) طبيعة المتجهات

100%
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 من المستوى المنخفض، سريع كائنات عامة، بطيء
⚠️ ملاحظة: يجب أن تكون جميع عناصر متجه R من نفس النوع. في حالة وجود أنواع مختلطة، سيقوم R بتحويلها تلقائيًا إلى النوع «الأوسع»:

R
# Mixed Types:Mixing Numbers and Strings → Convert All to Strings
c(1, "a", TRUE)
# [1] "1" "a" "TRUE"
💡 نصيحة: هذا هو أكبر فرق بين قوائم R وقوائم Python — فالمصفوفات في R متجانسة، بينما قوائم Python غير متجانسة. لتخزين بيانات من أنواع مختلفة، استخدم قائمة (list()) (سيتم تناولها في الدرس 9).

(3) لا يوجد مصطلح «Scalar» في لغة R

تتمتع المتجهات R بخاصية خفية: العدد الفردي هو أيضًا متجه طوله 1.

R
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) مقارنة بين الطرق المختلفة

R
# 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()

R
# 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

R
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"
⚠️ ملاحظة: هذه واحدة من أكثر الأخطاء شيوعًا في لغة R — فالمبتدئون القادمون من لغة Python يكتبون بشكل لا إرادي x[0]، مما يؤدي إلى إرجاع متجه فارغ بدلاً من العنصر الأول.

(3) الفهارس الصحيحة السالبة (باستثناء العناصر)

R
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:

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) الفهارس المسماة

حدد عناصر المتجه، ثم قم بالوصول إليها باستخدام أسمائها:

R
scores <- c(Alice = 85, Bob = 92, Charlie = 78)
scores
#   Alice      Bob   Charlie
#      85       92       78

scores["Bob"]
# Bob
#  92


6. العمليات المتجهة: التحويل التلقائي إلى متجهات

(1) ما المقصود بـ«التوجيه»؟

100%
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) متجه + عدد ثابت (توزيع العدد الثابت)

R
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) متجه + متجه (عملية على مستوى العناصر)

R
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
💡 نصيحة: هذه إحدى المزايا الرئيسية التي تتمتع بها لغة R مقارنةً بلغة Python. ففي لغة Python، لإضافة قائمتين، يتعين عليك استخدام numpy أو تعبير قائمة، بينما في لغة R، يمكن القيام بذلك في سطر واحد.

(4) ستحدث «تكرار» عندما تكون الأطوال مختلفة

R
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]
⚠️ ملاحظة: سيصدر تحذير إذا لم تكن الأطوال مضاعفات صحيحة لبعضها البعض. هذا النوع من الأخطاء شائع جدًّا في لغة R؛ تأكد من أن المتجهين لهما نفس الطول عند كتابة الكود.

(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()

R
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 طالبًا

R
# ============================================
# 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))
▶ جرّب الكود

الناتج المتوقع (مقتطف):

TEXT 📖 للعرض فقط
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 نتائج إحصائية


❓ أسئلة شائعة

س لماذا تبدأ مؤشرات R من 1 بدلاً من 0؟
ج تم تصميم لغة R على يد علماء رياضيات، وهي تتبع الأعراف الرياضية (يتم ترقيم عناصر المتجهات بدءًا من 1). وهذا أحد أكبر الاختلافات بين لغة R ولغات Python/Java/C. وغالبًا ما يقع المبتدئون في هذا الفخ: فيكتبون x[0] متوقعين استرجاع العنصر الأول، لكنهم ينتهون بمتجه فارغ numeric(0).
س ما هي العلاقة بين المتجهات والمصفوفات؟
ج المصفوفة هي «نسخة ثنائية الأبعاد» من المتجه — منظمة في صفوف وأعمدة (المتجه أحادي البعد c(1,2,3,4,5,6) الذي يُعاد تشكيله ليصبح مصفوفة 2×3 يصبح matrix(1:6, nrow = 2)).

📖 ملخص


📝 تمارين

  1. المشكلة الأساسية: أنشئ متجهًا من الأعداد الصحيحة من 1 إلى 10 باستخدام ثلاث طرق مختلفة: ① c():seq()؛ واستخدم identical() للتحقق من أن نتائج الطرق الثلاث متطابقة تمامًا. التقط لقطة شاشة لإخراج وحدة التحكم واحفظها.

  2. المشكلة الأساسية: أنشئ متجهًا x <- c(2, 4, 6, 8, 10)، واستخدم الفهرسة المنطقية لاستخراج العناصر الأكبر من 5، ثم اعرض المتجه الذي تمت تصفيته. احفظ الكود ولقطة شاشة للناتج.

  3. تمرين أساسي: اجمع paste() مع paste("Rank", 1:5, "th", sep = "")، وسجل النتيجة؛ ثم اجمع paste0() مع paste0("x", 1:5, "y")، وسجل النتيجة. التقط لقطة شاشة واحفظها.

  4. مشكلة متقدمة: قم بمحاكاة درجات 10 طلاب: ① قم بتوليد الدرجات عشوائيًا باستخدام sample(60:100, 10)؛ ② احسب المتوسط والوسيط وأعلى درجة وأدنى درجة والانحراف المعياري؛ ③ استخدم which.max() لإيجاد الترتيب للطالب الحاصل على أعلى درجة؛ ④ احسب عدد الطلاب الناجحين (≥60). احفظ لقطة شاشة لنتائج كل خطوة.

  5. التحدي: اكتب برنامجًا نصيًّا لمحاكاة سيناريو «توزيع الطلاب على الفصول الدراسية»: ① أنشئ متجهًا names <- c("Alice", "Bob", ...) يحتوي على أسماء 10 طلاب؛ ② أنشئ متجهًا scores <- sample(60:100, 10) يحتوي على 10 درجات؛ ③ قم بتسميته names(scores) <- names؛ ④ ابحث عن أسماء الطلاب الذين حصلوا على 90 درجة أو أكثر؛ ⑤ ابحث عن أسماء الطلاب الذين رسبوا؛ ⑥ قم بفرزها بترتيب تصاعدي واطبعها باستخدام sort(scores). بعد تشغيل البرنامج النصي، التقط لقطة شاشة واحفظ مخرجات وحدة التحكم بالكامل.

Web-Tutorial.com

فريق Web-Tutorial التقني

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

100%