R apply()، lapply()، sapply()، tapply() مع الأمثلة
⚡ ملخص ذكي
تشكل الدوال apply() و lapply() و sapply() و tapply() عائلة الدوال apply في لغة R، وهي بديل متجهي للحلقات الصريحة التي تطبق دالة مختارة عبر المصفوفات والقوائم والمتجهات والبيانات المجمعة لإرجاع نتائج موجزة.

يهدف هذا البرنامج التعليمي إلى تقديم مجموعة وظائف application(). تعتبر وظيفة Apply () هي الوظيفة الأساسية في جميع المجموعات. سوف نتعلم أيضًا sapply() وlapply() وtapply(). يمكن عرض مجموعة التطبيق كبديل للحلقة.
يتم تجميع مجموعة Apply () مع ص ضروري الحزمة إذا كنت تثبيت R مع اناكوندايمكن تغذية دالة apply في R بالعديد من الوظائف لأداء تطبيق زائد على مجموعة من الكائنات (إطار البيانات، القائمة، المتجه، إلخ). الغرض الأساسي من apply() هو تجنب الاستخدامات الصريحة لهياكل الحلقة. يمكن استخدامها لقائمة إدخال أو مصفوفة أو مصفوفة وتطبيق دالة. يمكن تمرير أي دالة إلى apply().
تطبيق () وظيفة
تطبيق() يأخذ إطار البيانات أو المصفوفة كمدخل ويعطي الإخراج في المتجهات أو القائمة أو المصفوفة. يتقدم وظيفة في ر تُستخدم في المقام الأول لتجنب الاستخدامات الصريحة لهياكل الحلقة. وهي أبسط مجموعة يمكن استخدامها على المصفوفات.
تأخذ هذه الدالة 3 وسيطات:
apply(X, MARGIN, FUN) Here: -x: an array or matrix -MARGIN: take a value or range between 1 and 2 to define where to apply the function: -MARGIN=1`: the manipulation is performed on rows -MARGIN=2`: the manipulation is performed on columns -MARGIN=c(1,2)` the manipulation is performed on rows and columns -FUN: tells which function to apply. Built functions like mean, median, sum, min, max and even user-defined functions can be applied>
أبسط مثال هو جمع مصفوفة على كافة الأعمدة. سيطبق الكود المطبق (m1، 2، sum) دالة المجموع على المصفوفة 5 × 6 ويعيد مجموع كل عمود يمكن الوصول إليه في مجموعة البيانات.
m1 <- matrix(C<-(1:10),nrow=5, ncol=6) m1 a_m1 <- apply(m1, 2, sum) a_m1
الإخراج:

أفضل ممارسة: قم بتخزين القيم قبل طباعتها على وحدة التحكم.
وظيفة لابلي ().
لابلي() الوظيفة مفيدة لإجراء عمليات على كائنات القائمة وتعيد كائن قائمة بنفس طول المجموعة الأصلية. تعيد lappy() قائمة بنفس طول كائن القائمة المدخل، حيث يكون كل عنصر منها نتيجة لتطبيق FUN على العنصر المقابل في القائمة. تأخذ Lapply في R القائمة أو المتجه أو إطار البيانات كمدخلات وتعطي إخراجًا في القائمة.
lapply(X, FUN) Arguments: -X: A vector or an object -FUN: Function applied to each element of x
l في lapply() يرمز إلى القائمة. الفرق بين lapply() و application() يكمن في إرجاع الإخراج. إخراج lapply() عبارة عن قائمة. يمكن استخدام lapply() لكائنات أخرى مثل إطارات البيانات والقوائم.
لا تحتاج الدالة lapply() إلى MARGIN.
يمكن أن يكون أحد الأمثلة السهلة للغاية هو تغيير قيمة سلسلة المصفوفة إلى أحرف صغيرة باستخدام دالة أقل. نقوم ببناء مصفوفة بأسماء الأفلام الشهيرة. الاسم مكتوب بالأحرف الكبيرة.
movies <- c("SPYDERMAN","BATMAN","VERTIGO","CHINATOWN") movies_lower <-lapply(movies, tolower) str(movies_lower)
الإخراج:
## List of 4 ## $:chr"spyderman" ## $:chr"batman" ## $:chr"vertigo" ## $:chr"chinatown"
يمكننا استخدام unlist() لتحويل القائمة إلى متجه.
movies_lower <-unlist(lapply(movies,tolower)) str(movies_lower)
الإخراج:
## chr [1:4] "spyderman" "batman" "vertigo" "chinatown"
وظيفة ساببلي ().
سابلي() تأخذ الوظيفة القائمة أو المتجه أو إطار البيانات كمدخل وتعطي الإخراج في المتجه أو البخور. إنها مفيدة للعمليات على كائنات القائمة وتعيد كائن قائمة بنفس طول المجموعة الأصلية. تؤدي دالة Sapply في R نفس وظيفة دالة lapply() ولكنها تعيد متجهًا.
sapply(X, FUN) Arguments: -X: A vector or an object -FUN: Function applied to each element of x
يمكننا قياس الحد الأدنى للسرعة والتوقفping مسافات السيارات من مجموعة بيانات السيارات.
dt <- cars lmn_cars <- lapply(dt, min) smn_cars <- sapply(dt, min) lmn_cars
الإخراج:
## $speed ## [1] 4 ## $dist ## [1] 2
smn_cars
الإخراج:
## speed dist ## 4 2
lmxcars <- lapply(dt, max) smxcars <- sapply(dt, max) lmxcars
الإخراج:
## $speed ## [1] 25 ## $dist ## [1] 120
smxcars
الإخراج:
## speed dist ## 25 120
يمكننا استخدام دالة مدمجة للمستخدم في lapply() أو sapply(). نقوم بإنشاء دالة تسمى avg لحساب متوسط الحد الأدنى والحد الأقصى للمتجه.
avg <- function(x) {
( min(x) + max(x) ) / 2}
fcars <- sapply(dt, avg)
fcars
الناتج
## speed dist ## 14.5 61.0
يعد Sapply في R أكثر كفاءة من lapply() في المخرجات التي يتم إرجاعها لأن sapply() يخزن القيم مباشرة في متجه. في المثال التالي، سنرى أن هذا ليس هو الحال دائمًا.
يمكننا تلخيص الفرق بين apply() و sapply() و `lapply() في الجدول التالي:
| الوظيفة | الحجج | الهدف | إدخال | الناتج |
|---|---|---|---|---|
| تطبيق | تطبيق(x، الهامش، المرح) | تطبيق دالة على الصفوف أو الأعمدة أو كليهما | إطار البيانات أو المصفوفة | ناقلات، قائمة، مجموعة |
| لابلي | لابلي (X، FUN) | تطبيق دالة على كافة عناصر الإدخال | القائمة أو المتجه أو إطار البيانات | الإدارية |
| sapply | سابلي (X، المرح) | تطبيق دالة على كافة عناصر الإدخال | القائمة أو المتجه أو إطار البيانات | ناقلات أو مصفوفة |
ناقلات شريحة
يمكننا استخدام lapply() أو sapply() القابلة للتبديل لتقسيم إطار البيانات. نقوم بإنشاء دالة، below_average()، تأخذ متجهًا للقيم الرقمية وترجع متجهًا يحتوي فقط على القيم التي تكون أعلى من المتوسط تمامًا. قمنا بمقارنة كلا النتيجتين مع الدالة المتطابقة ().
below_ave <- function(x) { ave <- mean(x) return(x[x > ave]) } dt_s<- sapply(dt, below_ave) dt_l<- lapply(dt, below_ave) identical(dt_s, dt_l)
الإخراج:
## [1] TRUE
وظيفة تابلي ().
تابلي () يحسب مقياسًا (المتوسط، الوسيط، الحد الأدنى، الحد الأقصى، إلخ.) أو دالة لكل متغير عامل في المتجه. إنها وظيفة مفيدة جدًا تتيح لك إنشاء مجموعة فرعية من المتجه ثم تطبيق بعض الوظائف على كل مجموعة فرعية.
tapply(X, INDEX, FUN = NULL)
Arguments:
-X: An object, usually a vector
-INDEX: A list containing factor
-FUN: Function applied to each element of x
إن جزءًا من عمل عالم البيانات أو الباحثين هو حساب ملخصات المتغيرات. على سبيل المثال، قياس المتوسط أو تجميع البيانات بناءً على سمة معينة. يتم تجميع معظم البيانات حسب المعرف والمدينة والدول وما إلى ذلك. يكشف التلخيص على أساس المجموعة عن أنماط أكثر إثارة للاهتمام.
لفهم كيفية عملها، دعونا نستخدم مجموعة بيانات القزحية. تحظى مجموعة البيانات هذه بشهرة كبيرة في عالم التعلم الآلي. الغرض من مجموعة البيانات هذه هو التنبؤ بفئة كل نوع من أنواع الزهور الثلاثة: Sepal، Versicolor، Virginica. تجمع مجموعة البيانات معلومات عن كل نوع حول طوله وعرضه.
كعمل سابق، يمكننا حساب متوسط الطول لكل نوع. يعد Tapply in R طريقة سريعة لإجراء هذا الحساب.
data(iris) tapply(iris$Sepal.Width, iris$Species, median)
الإخراج:
## setosa versicolor virginica ## 3.4 2.8 3.0
