R apply()، lapply()، sapply()، tapply() مع الأمثلة

⚡ ملخص ذكي

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

  • 🔲 يتقدم(): يقوم بتشغيل دالة على صفوف أو أعمدة المصفوفة.
  • 📋 lapply(): يطبق دالة على كل عنصر من عناصر القائمة، ويعيد قائمة.
  • 📊 sapply(): يشبه دالة lapply() ولكنه يبسط الإخراج إلى متجه.
  • 🗂️ tapply(): يطبق دالة على مجموعات محددة بواسطة عامل.
  • 🤖 مساعدة الذكاء الاصطناعي: يقترح الذكاء الاصطناعي استخدام التعليمات البرمجية المتجهة بدلاً من الحلقات البطيئة.

في لغة R، تُستخدم الدوال apply و lapply و sapply و tapply.

يهدف هذا البرنامج التعليمي إلى تقديم مجموعة وظائف 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

الإخراج:

تطبيق () مثال على الوظيفة في R
تطبيق مثال على الدالة () في R

أفضل ممارسة: قم بتخزين القيم قبل طباعتها على وحدة التحكم.

وظيفة لابلي ().

لابلي() الوظيفة مفيدة لإجراء عمليات على كائنات القائمة وتعيد كائن قائمة بنفس طول المجموعة الأصلية. تعيد 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

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

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

تعمل الدالة vapply() مثل الدالة sapply() ولكنها تفرض نوع إرجاع من أجل السلامة، بينما الدالة mapply() هي نسخة متعددة المتغيرات تطبق دالة على عدة متجهات في وقت واحد.

تُطبّق كلتا الدالتين دالةً على كل عنصر من عناصر القائمة أو المتجه. تُعيد الدالة lapply() دائمًا قائمة، بينما تُبسّط الدالة sapply() النتيجة إلى متجه كلما أمكن ذلك.

نعم. يمكن للمساعدين الذين يستخدمون الذكاء الاصطناعي تحويل الحلقات إلى استدعاءات apply أو sapply، واقتراح الوظيفة المناسبة لبياناتك، وشرح الوسائط مثل MARGIN و FUN.

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

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