وظيفة المصفوفة في R: إنشاء وطباعة وإضافة عمود وشريحة

⚡ ملخص ذكي

المصفوفة في لغة R هي مصفوفة ثنائية الأبعاد تحتوي على نوع بيانات واحد عبر m صفوف و n أعمدة، يتم إنشاؤها باستخدام matrix()، وتوسيعها باستخدام cbind() و rbind()، ويتم الوصول إليها من خلال الأقواس المربعة.

  • 🧩 بناء: المصفوفة عبارة عن متجه له سمة البعد، لذلك يجب أن تشترك كل خلية في نوع بيانات واحد.
  • 🛠️ خلق: تقوم الدالة matrix(data, nrow, ncol, byrow) بترتيب سلسلة، ويستنتج R البعد المفقود.
  • 🔄 تنفيذ الطلب: byrow = FALSE يملأ عمودًا تلو الآخر، بينما byrow = TRUE يملأ صفًا تلو الآخر.
  • ➕ النمو: تقوم الدالة cbind() بإلحاق الأعمدة وتقوم الدالة rbind() بإلحاق الصفوف، بشرط أن يتطابق البعد المشترك.
  • ✂ تشريح: يقرأ الأمر m[row, column] الصفوف أولاً، ويحدد الجانب الفارغ كل شيء على ذلك الجانب.
  • 🏷️ ملصقات: تقوم الدوال dimnames و rownames() و colnames() باستبدال العناصر النائبة [,1] بأسماء قابلة للقراءة.
  • ➕➖ علم الحساب: تقوم علامة النجمة بضرب العناصر عنصرًا بعنصر، بينما تقوم علامة %*% بضرب المصفوفات.

دالة المصفوفة في لغة R: إنشاء، طباعة، إضافة عمود، وتقطيع

وظيفة المصفوفة في R

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

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

ملاحظة: تُعيد الدالة matrix() دائمًا بُعدين فقط. لإنشاء بنية بيانات بثلاثة أبعاد أو أكثر في لغة R، استخدم الدالة array() مع متجه dim، أو قم بتعيين قيمة dim() مباشرةً. يوضح الرسم البياني أدناه تخطيط الصفوف والأعمدة الذي تتبعه كل مصفوفة.

تخطيط الصفوف والأعمدة لدالة المصفوفة في لغة R

كيفية إنشاء مصفوفة في R

يمكننا إنشاء مصفوفة باستخدام الدالة مصفوفة()تأخذ صيغة R الأساسية خمسة وسائط، ويتم عرض الوسائط الثلاثة الأكثر استخدامًا هنا:

matrix(data, nrow, ncol, byrow = FALSE)

الحجج:

  • البيانات: مجموعة العناصر التي سيقوم برنامج R بترتيبها في صفوف وأعمدة المصفوفة.
  • الآنعدد الصفوف.
  • ncolعدد الأعمدة.
  • byrow: علامة منطقية. عند ضبط القيمة الافتراضية byrow = FALSE، يتم ملء المصفوفة عمودًا تلو الآخر، من الأعلى إلى الأسفل. أما عند ضبط القيمة byrow = TRUE، فيتم ملؤها صفًا تلو الآخر، من اليسار إلى اليمين.
  • أسماء الأبعادقائمة اختيارية بطول اثنين تحتوي على أسماء الصفوف وأسماء الأعمدة.

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

لنقم بإنشاء مصفوفتين 5×2 من سلسلة الأرقام من 1 إلى 10، واحدة مع byrow = TRUE والأخرى مع byrow = FALSE، لنرى الفرق.

# Construct a matrix with 5 rows that contain the numbers 1 up to 10 and byrow =  TRUE 
matrix_a <-matrix(1:10, byrow = TRUE, nrow = 5)
matrix_a

الإخراج:

بسبب استخدام byrow = TRUE، تقوم وحدة التحكم بملء الصف الأول بالرقمين 1 و2، والصف الثاني بالرقمين 3 و4، وهكذا.

مخرجات وحدة التحكم لمصفوفة matrix_a المعبأة صفًا تلو الآخر مع byrow = TRUE

الآن، دعونا نطبع أبعاد المصفوفة في R باستخدام dim(). بناء جملة طباعة المصفوفة في R باستخدام dim() هو:

# Print dimension of the matrix with dim()
dim(matrix_a)

الإخراج:

## [1] 5 2

تقوم الدالة dim() بإرجاع عدد الصفوف أولاً وعدد الأعمدة ثانياً، مما يؤكد شكل 5×2.

املأ المصفوفة عموديًا باستخدام byrow = FALSE

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

# Construct a matrix with 5 rows that contain the numbers 1 up to 10 and byrow =  FALSE
matrix_b <-matrix(1:10, byrow = FALSE, nrow = 5)
matrix_b

الإخراج:

مخرجات وحدة التحكم لمصفوفة matrix_b المعبأة عمودًا بعمود مع byrow = FALSE

مرة أخرى، قم بطباعة أبعاد المصفوفة باستخدام dim(). يوجد أدناه بناء جملة لبعد مصفوفة الطباعة R:

# Print dimension of the matrix with dim()
dim(matrix_b)

الإخراج:

## [1] 5 2

يبقى الشكل دون تغيير عند 5×2، لأن كل صف يغير ترتيب التعبئة ولا يغير الأبعاد أبدًا.

ملاحظات: استخدام الأمر matrix_b <-matrix(1:10, byrow = FALSE, ncol = 2) سيكون له نفس التأثير كما هو مذكور أعلاه، لأن R يستنتج nrow = 5 من القيم العشرة المقدمة.

يمكنك أيضًا إنشاء مصفوفة 4×3 باستخدام ncol. سيقوم R بإنشاء 3 أعمدة وملء كل عمود من الأعلى إلى الأسفل. راجع مثالًا.

matrix_c <-matrix(1:12, byrow = FALSE, ncol = 3)
matrix_c

الإخراج:

##       [,1] [,2] [,3]
## [1,]    1    5    9
## [2,]    2    6   10
## [3,]    3    7   11
## [4,]    4    8   12

عناوين الأعمدة من [,1] إلى [,3] وتسميات الصفوف من [1,] إلى [4,] هي عناصر نائبة افتراضية في لغة R. تختفي هذه العناصر بمجرد إدخال أسماء الأبعاد الحقيقية، كما هو موضح لاحقًا في هذا الدرس.

على سبيل المثال:

dim(matrix_c)

الإخراج:

## [1] 4 3

إضافة عمود إلى مصفوفة باستخدام cbind()

يمكنك إضافة عمود إلى المصفوفة R باستخدام الأمر cbind(). يرمز cbind() إلى ربط الأعمدة، ويمكنه دمج أي عدد من المصفوفات أو الأعمدة حسب الحاجة. على سبيل المثال، أنشأ مثالنا السابق مصفوفة 5×2. نضيف عمودًا ثالثًا ونتأكد من أن الأبعاد هي 5×3.

على سبيل المثال:

# concatenate c(1:5) to the matrix_a
matrix_a1 <- cbind(matrix_a, c(1:5))
# Check the dimension
dim(matrix_a1)

الإخراج:

## [1] 5 3

على سبيل المثال:

matrix_a1

الناتج

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

على سبيل المثال:

يمكننا أيضًا ربط أكثر من عمود في وقت واحد. تقوم الكتلة التالية بإنشاء المصفوفة matrix_a2، وهي مصفوفة 4×3 تحتوي على الأرقام من 13 إلى 24، بحيث يمكن ضمها إلى المصفوفة matrix_c 4×3 لإنتاج نتيجة 4×6 تغطي الأرقام من 1 إلى 24.

matrix_a2 <-matrix(13:24, byrow = FALSE, ncol = 3)

الإخراج:

##      [,1] [,2] [,3]
## [1,]   13   17   21
## [2,]   14   18   22
## [3,]   15   19   23
## [4,]   16   20   24

على سبيل المثال:

matrix_c <-matrix(1:12, byrow = FALSE, ncol = 3)		
matrix_d <- cbind(matrix_a2, matrix_c)
dim(matrix_d)

الإخراج:

## [1] 4 6

نوتيجب أن يتساوى عدد صفوف المصفوفات في لغة R لكي تعمل دالة cbind(). إذا اختلف العدد، فإن R إما تعيد استخدام المدخلات الأقصر أو تُظهر خطأً، لذا فإن التحقق من أبعاد المصفوفات باستخدام دالة dim() أولاً هو الأفضل.

بينما تقوم الدالة cbind() بدمج الأعمدة، تقوم الدالة rbind() بإضافة الصفوف. لنضف صفًا واحدًا إلى مصفوفة matrix_c ونتحقق من أن أبعادها 5×3.

matrix_c <-matrix(1:12, byrow = FALSE, ncol = 3)
# Create a vector of 3 columns
add_row <- c(1:3)
# Append to the matrix
matrix_c <- rbind(matrix_c, add_row)
# Check the dimension
dim(matrix_c)

الإخراج:

## [1] 5 3

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

شريحة مصفوفة

يمكننا اختيار عنصر واحد أو عدة عناصر من مصفوفة في برمجة آر باستخدام الأقواس المربعة [ ]. داخل الأقواس، يأتي مُحدد الصف أولاً ثم مُحدد العمود ثانياً، مفصولين بفاصلة. وهنا يأتي دور التقطيع.

فمثلا:

  • Matrix_c[1,2] يحدد العنصر الموجود في الصف الأول والعمود الثاني.
  • ينتج عن matrix_c[1:3,2:3] مصفوفة شرائح R تحتوي على البيانات في الصفوف 1 و2 و3 والأعمدة 2 و3.
  • Matrix_c[,1] يحدد كافة عناصر العمود الأول.
  • Matrix_c[1,] يحدد كافة عناصر الصف الأول.

لذا، فإن ترك جانب من الفاصلة فارغًا يعني تضمين جميع القيم الموجودة على ذلك الجانب. إحدى النتائج التي قد تُربك المبتدئين هي: عند تحديد صف أو عمود واحد، يتجاهل R البُعد الفارغ ويُعيد متجهًا عاديًا. إضافة `drop = FALSE`، كما في `matrix_c[1, , drop = FALSE]`، تُبقي النتيجة مصفوفة.

هنا هو الإخراج الذي تحصل عليه للرموز المذكورة أعلاه

نتائج وحدة التحكم لتعبيرات تقطيع المصفوفات الأربعة في لغة R

تسمية صفوف وأعمدة المصفوفة في لغة R

تُصعّب التسميات الافتراضية مثل [,1] و[3,] قراءة المخرجات بمجرد أن تحمل المصفوفة معنىً حقيقيًا. تُضيف الوسيطة dimnames، ودالتا الاستبدال rownames() وcolnames()، تسميات نصية تنتقل مع المصفوفة عبر cbind() وt() وكل عملية تقطيع.

# Name the rows and columns while the matrix is built
sales <- matrix(1:6, nrow = 2, ncol = 3,
                dimnames = list(c('north', 'south'), c('q1', 'q2', 'q3')))

# Or attach the names afterwards
rownames(sales) <- c('north', 'south')
colnames(sales) <- c('q1', 'q2', 'q3')

# Read the names back as a list of two character vectors
dimnames(sales)

# Names make label based slicing possible
sales['north', 'q2']
الوظيفة يقرأ أطقم / مجموعات
dimnames(m) كلا البعدين كقائمة من متجهين dimnames(m) <- list(rows, cols)
أسماء الصفوف (م) تسميات الصفوف rownames(m) <- rows
أسماء الأعمدة (م) تسميات الأعمدة colnames(m) <- cols
dim(m) الصفوف والأعمدة كعددين صحيحين dim(m) <- c(nrow, ncol)

بمجرد وجود التصنيفات، يصبح `sales['north', 'q2']` أكثر وضوحًا من `sales[1, 2]`، ويبقى هذا التصنيف ثابتًا حتى بعد إعادة ترتيب الصفوف. يؤدي تعيين قيمة `dimnames` إلى `NULL` إلى إزالة مجموعة التصنيفات هذه مرة أخرى، وتحمل المصفوفة المحولة باستخدام `as.data.frame()` أسماء الصفوف والأعمدة مباشرةً إلى... إطار البيانات.

مصفوفة Operaالعمليات في لغة R: الحساب، والنقل، والضرب

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

m1 <- matrix(1:4, nrow = 2)
m2 <- matrix(5:8, nrow = 2)

m1 + m2          # element by element addition
m1 * m2          # element by element product, NOT matrix multiplication
m1 %*% m2        # true matrix multiplication
t(m1)            # transpose: rows become columns
solve(m1)        # inverse, for a square matrix that is not singular

rowSums(m1)      # one total per row
colMeans(m1)     # one mean per column
apply(m1, 1, max)   # any function, applied row by row
  • t(m): يقوم هذا الإجراء بتبديل المصفوفة، بحيث يصبح العنصر [i, j] هو [j, i]. يتم نقل أسماء الأبعاد.
  • حل(م): تُرجع معكوس مصفوفة مربعة غير منفردة، و solve(a, b) تحل نظامًا خطيًا.
  • مجموع الصفوف / مجموع الأعمدة / متوسط ​​الصفوف / متوسط ​​الأعمدة: موثقة على أنها مكافئة لـ apply() مع sum أو mean، ولكنها أسرع بكثير.
  • تطبيق(م، الهامش، الدالة): MARGIN = 1 يقوم بمسح الصفوف و MARGIN = 2 يقوم بمسح الأعمدة، وذلك لأي دالة تقوم بتوفيرها.
  • التشخيص، الكشف، التداخل: قطري، محدد، والشكل الأسرع لـ t(x) %*% y.

لأن هذه العمليات مُوجّهة، فإنها تحل محل الحلقات بدلاً من أن تكون جزءًا منها. فعلى سبيل المثال، يصبح تلخيص البيانات الذي كان يتطلب حلقة تكرارية متداخلة على آلاف الخلايا مجرد استدعاء واحد للدالة colMeans()، وهو أمر بالغ الأهمية مع ازدياد حجم البيانات.

المصفوفة مقابل إطار البيانات مقابل المصفوفة في لغة R

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

الممتلكات مصفوفة إطار البيانات مجموعة
الأبعاد 2 بالضبط 2 بالضبط أي رقم
أنواع الأعمدة نوع واحد للكائن بأكمله نوع مختلف لكل عمود نوع واحد للكائن بأكمله
بنيت مع مصفوفة() data.frame() مجموعة ()
الاستخدام النموذجي الحساب العددي والجبر الخطي بيانات رصدية مختلطة الجداول المكدسة، مثل الإحصاءات حسب السنة
تسميات الصفوف أسماء الأبعاد الاختيارية أسماء الصفوف موجودة دائمًا أسماء الأبعاد الاختيارية
# A matrix holds one type only, so mixing coerces everything to character
mixed <- matrix(c(1, 2, 'a', 'b'), nrow = 2)
class(mixed[1, 1])

# Convert between the structures
as.data.frame(matrix_c)
as.matrix(mtcars)

# A matrix is the two dimensional case of an array
is.matrix(matrix_c)
inherits(matrix_c, 'array')

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

الأسئلة الشائعة

يُعيد R استخدام القيم بدلاً من رفضها، لذا فإن الدالة matrix(1:3, nrow = 2, ncol = 3) تُكرر التسلسل. يظهر تحذير فقط عندما لا يكون طول المصفوفة مضاعفًا دقيقًا لعدد الخلايا، مما يجعل إعادة الاستخدام الصامتة خطأً سهل التغاضي عنه.

استخدم فهرسًا سالبًا: m[-2, ] يحذف الصف الثاني، و m[, -3] يحذف العمود الثالث. يمكن حذف عدة أعمدة في آنٍ واحد باستخدام m[-c(1, 4), ]. يبقى الكائن الأصلي دون تغيير حتى تُعيد تعيين النتيجة.

يؤدي تحديد صف أو عمود واحد إلى حذف البُعد الفارغ افتراضيًا. أضف `drop = FALSE`، كما في `m[1, , drop = FALSE]`، للاحتفاظ بمصفوفة من صف واحد. هذا الأمر مهم عند تمرير النتيجة إلى دالة تتوقع بُعدين.

تُعيد الدالة `which(m == value, arr.ind = TRUE)` نتيجةً من عمودين تُحددان صف وعمود كل تطابق. أما بدون `arr.ind`، فستكون النتيجة عبارة عن فهرس خطي واحد مُرتب تنازليًا حسب الأعمدة، وهو ما نادرًا ما يكون المطلوب.

استخدم الدالة array(data, dim = c(rows, columns, layers)) أو قم بتعيين dim(x) مباشرةً على متجه. عندئذٍ، يأخذ التقطيع فهرسًا واحدًا لكل بُعد، مثل a[2, 3, 1]. المصفوفة هي ببساطة الحالة ثنائية الأبعاد للمصفوفة.

نعم. يشير مرجع R الأساسي إلى أن rowSums و colMeans مكافئان لـ apply() مع sum أو mean ولكنهما أسرع بكثير، وكلاهما يتفوق على حلقة for الصريحة لأن التكرار يحدث في الكود المترجم بدلاً من المفسر.

تُعتبر عملية ملاءمة النموذج عملية جبر خطي: ​​حيث تُشكّل الميزات مصفوفة، وتُشكّل المعاملات متجهًا، والتنبؤ عبارة عن عملية ضرب واحدة (%). آلة التعلم لذلك تتطلب الحزم مصفوفة رقمية بدلاً من إطار بيانات كمدخل.

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

تلخيص هذه التدوينة بـ: