وظائف في برمجة R مع مثال
ما هي الوظيفة في R؟
A وظيفة، في بيئة البرمجة، عبارة عن مجموعة من التعليمات. يقوم المبرمج ببناء وظيفة لتجنبها تكرار ال نفس المهمة، أو تقليلها تعقيد.
يجب أن تكون وظيفة
- مكتوبة لتنفيذ مهام محددة
- قد تتضمن أو لا تتضمن الحجج
- تحتوي على جسد
- قد يُرجع أو لا يُرجع قيمة واحدة أو أكثر.
النهج العام للوظيفة هو استخدام جزء الوسيطة المدخلات، اطعم ال الجسد جزء وأخيرا العودة الناتج. بناء جملة الدالة هو التالي:
function (arglist) {
#Function body
}
R وظائف مدمجة مهمة
هناك الكثير من الوظائف المضمنة في R. يقوم R بمطابقة معلمات الإدخال الخاصة بك مع وسيطات الوظيفة الخاصة به، إما من خلال القيمة أو حسب الموضع، ثم ينفذ نص الوظيفة. يمكن أن تحتوي وسائط الدالة على قيم افتراضية: إذا لم تحدد هذه الوسائط، فسوف يأخذ R القيمة الافتراضية.
ملاحظات:
من الممكن رؤية الكود المصدري للوظيفة عن طريق تشغيل اسم الوظيفة نفسها في وحدة التحكم.
سوف نرى ثلاث مجموعات من الوظائف في العمل
- الوظيفة العامة
- وظيفة الرياضيات
- الوظيفة الإحصائية
وظائف عامة
نحن على دراية بالوظائف العامة مثل cbind() و rbind() و range() و sort() و order(). كل من هذه الوظائف لها مهمة محددة، وتأخذ وسيطات لإرجاع الناتج. فيما يلي وظائف مهمة يجب على المرء أن يعرفها-
دالة فرق ().
إذا كنت تعمل السلاسل الزمنية، تحتاج إلى تثبيت السلسلة عن طريق أخذها قيم التأخر. A عملية ثابتة يسمح بمتوسط ثابت، والتباين، والارتباط الذاتي مع مرور الوقت. يؤدي هذا بشكل أساسي إلى تحسين التنبؤ بالسلسلة الزمنية. يمكن القيام بذلك بسهولة باستخدام الدالة diff (). يمكننا بناء بيانات سلاسل زمنية عشوائية ذات اتجاه ثم استخدام الدالة diff() لتثبيت السلسلة. تقبل الدالة diff () وسيطًا واحدًا ومتجهًا وترجع الفرق المتخلف والمتكرر المناسب.
ملاحظات:غالبًا ما نحتاج إلى إنشاء بيانات عشوائية، ولكن من أجل التعلم والمقارنة، نريد أن تكون الأرقام متطابقة عبر الأجهزة. للتأكد من أننا جميعًا نولد نفس البيانات، نستخدم دالة set.seed() بقيم عشوائية 123. يتم إنشاء دالة set.seed() من خلال عملية مولد الأرقام العشوائية الزائفة التي تجعل كل أجهزة الكمبيوتر الحديثة لها نفس تسلسل الأرقام. إذا لم نستخدم دالة set.seed()، فسيكون لدينا جميعًا تسلسل مختلف من الأرقام.
set.seed(123) ## Create the data x = rnorm(1000) ts <- cumsum(x) ## Stationary the serie diff_ts <- diff(ts) par(mfrow=c(1,2)) ## Plot the series plot(ts, type='l') plot(diff(ts), type='l')
دالة الطول ().
في كثير من الحالات، نريد أن نعرف الطول متجه للحساب أو للاستخدام في حلقة for. تحسب دالة length() عدد الصفوف في المتجه x. تستورد التعليمات البرمجية التالية مجموعة بيانات cars وتعيد عدد الصفوف.
ملاحظات: length() يُرجع عدد العناصر في المتجه. إذا تم تمرير الدالة إلى مصفوفة أو إطار بيانات، فسيتم إرجاع عدد الأعمدة.
dt <- cars ## number columns length(dt)
الإخراج:
## [1] 1
## number rows length(dt[,1])
الإخراج:
## [1] 50
وظائف الرياضيات
يحتوي R على مجموعة من الوظائف الرياضية.
| المُشغل | الوصف |
|---|---|
| القيمة المطلقة (x) | تأخذ القيمة المطلقة لـ x |
| سجل (س ، قاعدة = ص) | تأخذ لوغاريتم x للقاعدة y ؛ إذا لم يتم تحديد الأساس ، يتم إرجاع اللوغاريتم الطبيعي |
| إكسب (x) | إرجاع أسي x |
| الجذر التربيعي (x) | إرجاع الجذر التربيعي لـ x |
| مضروب (خ) | إرجاع مضروب x (x!) |
# sequence of number from 44 to 55 both including incremented by 1 x_vector <- seq(45,55, by = 1) #logarithm log(x_vector)
الإخراج:
## [1] 3.806662 3.828641 3.850148 3.871201 3.891820 3.912023 3.931826 ## [8] 3.951244 3.970292 3.988984 4.007333
#exponential exp(x_vector)
#squared root sqrt(x_vector)
الإخراج:
## [1] 6.708204 6.782330 6.855655 6.928203 7.000000 7.071068 7.141428 ## [8] 7.211103 7.280110 7.348469 7.416198
#factorial factorial(x_vector)
الإخراج:
## [1] 1.196222e+56 5.502622e+57 2.586232e+59 1.241392e+61 6.082819e+62 ## [6] 3.041409e+64 1.551119e+66 8.065818e+67 4.274883e+69 2.308437e+71 ## [11] 1.269640e+73
الدالات الإحصائية
يحتوي التثبيت القياسي R على مجموعة واسعة من الوظائف الإحصائية. في هذا البرنامج التعليمي، سوف نلقي نظرة سريعة على أهم وظيفة..
الوظائف الإحصائية الأساسية
| المُشغل | الوصف |
|---|---|
| يعني (س) | يعني س |
| الوسيط (x) | متوسط x |
| فار (خ) | تباين x |
| التنمية المستدامة (خ) | الانحراف المعياري لـ x |
| مقياس (خ) | الدرجات القياسية (z-scores) لـ x |
| الكمي (س) | ربعيات x |
| ملخص(خ) | ملخص x: المتوسط، الحد الأدنى، الحد الأقصى وما إلى ذلك. |
speed <- dt$speed speed # Mean speed of cars dataset mean(speed)
الإخراج:
## [1] 15.4
# Median speed of cars dataset median(speed)
الإخراج:
## [1] 15
# Variance speed of cars dataset var(speed)
الإخراج:
## [1] 27.95918
# Standard deviation speed of cars dataset sd(speed)
الإخراج:
## [1] 5.287644
# Standardize vector speed of cars dataset head(scale(speed), 5)
الإخراج:
## [,1] ## [1,] -2.155969 ## [2,] -2.155969 ## [3,] -1.588609 ## [4,] -1.588609 ## [5,] -1.399489
# Quantile speed of cars dataset quantile(speed)
الإخراج:
## 0% 25% 50% 75% 100% ## 4 12 15 19 25
# Summary speed of cars dataset summary(speed)
الإخراج:
## Min. 1st Qu. Median Mean 3rd Qu. Max. ## 4.0 12.0 15.0 15.4 19.0 25.0
حتى هذه اللحظة، تعلمنا الكثير من وظائف R المضمنة.
ملاحظات: كن حذرًا مع فئة الوسيطة، أي رقمية أو منطقية أو سلسلة. على سبيل المثال، إذا أردنا تمرير قيمة سلسلة، فنحن بحاجة إلى إحاطة السلسلة بعلامة اقتباس: "ABC" .
وظيفة الكتابة في R
في بعض الأحيان، نحتاج إلى كتابة دالتنا الخاصة لأنه يتعين علينا إنجاز مهمة معينة ولا توجد دالة جاهزة. تتضمن الوظيفة المعرفة من قبل المستخدم أ الاسم, الحجج و الجسد.
function.name <- function(arguments)
{
computations on the arguments
some other code
}
ملاحظات: من الممارسات الجيدة تسمية دالة معرفة من قبل المستخدم تختلف عن الوظيفة المضمنة. إنه يتجنب الارتباك.
وظيفة وسيطة واحدة
في المقتطف التالي، نحدد دالة مربعة بسيطة. تقبل الدالة قيمة وترجع مربع القيمة.
square_function<- function(n)
{
# compute the square of integer `n`
n^2
}
# calling the function and passing value 4
square_function(4)
شرح الكود
- تم تسمية الدالة بـ Square_function؛ يمكن أن نسميها ما نريد.
- يتلقى الوسيطة "ن". نحن لم يحدد نوع المتغير حتى يتمكن المستخدم من تمرير عدد صحيح أو متجه أو مصفوفة
- تأخذ الدالة الإدخال "n" وترجع مربع الإدخال. عند الانتهاء من استخدام الدالة، يمكننا إزالتها باستخدام الدالة rm().
# بعد إنشاء الوظيفة
rm(square_function) square_function
على وحدة التحكم، يمكننا رؤية رسالة خطأ: خطأ: لم يتم العثور على الكائن 'square_function' مما يشير إلى أن الوظيفة غير موجودة.
نطاق البيئة
في ر، بيئة هو مجموعة شتاء XNUMX للكائنات مثل الوظائف والمتغيرات وإطار البيانات وما إلى ذلك.
يفتح R بيئة في كل مرة تتم فيها مطالبة Rstudio.
بيئة المستوى الأعلى المتاحة هي البيئة العالمية، يسمى R_GlobalEnv. ولدينا البيئة المحلية.
يمكننا سرد محتوى البيئة الحالية.
ls(environment())
الناتج
## [1] "diff_ts" "dt" "speed" "square_function" ## [5] "ts" "x" "x_vector"
يمكنك رؤية جميع المتغيرات والوظائف التي تم إنشاؤها في ملف R_GlobalEnv.
ستختلف القائمة أعلاه بالنسبة لك بناءً على الكود التاريخي الذي تقوم بتنفيذه في R Studio.
لاحظ أن n هي وسيطة الدالة Square_function ليس في هذه البيئة العالمية.
A جديد يتم إنشاء البيئة لكل وظيفة. في المثال أعلاه، تقوم الدالة Square_function() بإنشاء بيئة جديدة داخل البيئة العامة.
لتوضيح الفرق بين شامل و البيئة المحليةدعونا ندرس المثال التالي
تأخذ هذه الوظيفة قيمة x كوسيطة وتضيفها إلى تعريف y خارج الوظيفة وداخلها
تقوم الدالة f بإرجاع الإخراج 15. وذلك لأن y تم تعريفه في البيئة العالمية. يمكن استخدام أي متغير محدد في البيئة العالمية محليًا. المتغير y له قيمة 10 أثناء كافة استدعاءات الوظائف ويمكن الوصول إليه في أي وقت.
دعونا نرى ما سيحدث إذا تم تعريف المتغير y داخل الدالة.
نحن بحاجة إلى إسقاط `y` قبل تشغيل هذا الرمز باستخدام rm r
يكون الناتج أيضًا 15 عندما نستدعي f(5) ولكنه يُرجع خطأ عندما نحاول طباعة القيمة y. المتغير y غير موجود في البيئة العالمية.
أخيرًا، يستخدم R أحدث تعريف للمتغيرات لتمريره داخل نص الدالة. دعنا نفكر في المثال التالي:
يتجاهل R قيم y المحددة خارج الدالة لأننا أنشأنا متغيرًا صريحًا داخل نص الدالة.
وظيفة الوسائط المتعددة
يمكننا كتابة دالة بأكثر من وسيطة. خذ بعين الاعتبار الوظيفة التي تسمى "الأوقات". إنها دالة مباشرة تقوم بضرب متغيرين.
times <- function(x,y) {
x*y
}
times(2,4)
الإخراج:
## [1] 8
متى يجب أن نكتب الدالة؟
يحتاج عالم البيانات إلى القيام بالعديد من المهام المتكررة. في معظم الأحيان، نقوم بنسخ ولصق أجزاء من التعليمات البرمجية بشكل متكرر. على سبيل المثال، يوصى بشدة بتسوية المتغير قبل تشغيل ملف آلة التعلم خوارزمية. صيغة تطبيع المتغير هي:
نحن نعرف بالفعل كيفية استخدام الدالتين min() وmax() في R. نستخدم مكتبة tibble لإنشاء إطار البيانات. تعتبر Tibble حتى الآن الوظيفة الأكثر ملاءمة لإنشاء مجموعة بيانات من البداية.
library(tibble) # Create a data frame data_frame <- tibble( c1 = rnorm(50, 5, 1.5), c2 = rnorm(50, 5, 1.5), c3 = rnorm(50, 5, 1.5), )
سنمضي في خطوتين لحساب الوظيفة الموضحة أعلاه. في الخطوة الأولى، سنقوم بإنشاء متغير يسمى c1_norm وهو إعادة قياس c1. في الخطوة الثانية، نقوم فقط بنسخ ولصق كود c1_norm وتغييره باستخدام c2 وc3.
تفاصيل الدالة مع العمود c1:
المُرشِح: : data_frame$c1 -min(data_frame$c1))
المقام: الحد الأقصى (data_frame$c1)-min(data_frame$c1))
ولذلك، يمكننا تقسيمها للحصول على القيمة الطبيعية للعمود c1:
(data_frame$c1 -min(data_frame$c1))/(max(data_frame$c1)-min(data_frame$c1))
يمكننا إنشاء c1_norm وc2_norm وc3_norm:
Create c1_norm: rescaling of c1 data_frame$c1_norm <- (data_frame$c1 -min(data_frame$c1))/(max(data_frame$c1)-min(data_frame$c1)) # show the first five values head(data_frame$c1_norm, 5)
الإخراج:
## [1] 0.3400113 0.4198788 0.8524394 0.4925860 0.5067991
إنها تعمل. يمكننا النسخ واللصق
data_frame$c1_norm <- (data_frame$c1 -min(data_frame$c1))/(max(data_frame$c1)-min(data_frame$c1))
ثم قم بتغيير c1_norm إلى c2_norm وc1 إلى c2. نحن نفعل الشيء نفسه لإنشاء c3_norm
data_frame$c2_norm <- (data_frame$c2 - min(data_frame$c2))/(max(data_frame$c2)-min(data_frame$c2)) data_frame$c3_norm <- (data_frame$c3 - min(data_frame$c3))/(max(data_frame$c3)-min(data_frame$c3))
لقد قمنا بإعادة قياس المتغيرات c1 وc2 وc3 بشكل مثالي.
ومع ذلك، هذه الطريقة عرضة للخطأ. يمكننا نسخ اسم العمود ونسيان تغييره بعد اللصق. لذلك، من الممارسات الجيدة كتابة دالة في كل مرة تحتاج فيها إلى لصق نفس الكود أكثر من مرتين. يمكننا إعادة ترتيب الكود في صيغة ونسميها عند الحاجة. لكتابة دالتنا الخاصة، نحتاج إلى إعطاء:
- الإسم: تطبيع.
- عدد الوسائط: نحتاج فقط إلى وسيطة واحدة، وهي العمود الذي نستخدمه في حساباتنا.
- الجسد: هذه ببساطة هي الصيغة التي نريد إرجاعها.
سنتابع خطوة بخطوة لإنشاء وظيفة التطبيع.
الخطوة 1) نقوم بإنشاء ملف مرشح، الذي . في R، يمكننا تخزين المرشح في متغير مثل هذا:
nominator <- x-min(x)
الخطوة 2) نحن نحسب المقام - صفة مشتركة - حالة: . يمكننا تكرار فكرة الخطوة 1 وتخزين الحساب في متغير:
denominator <- max(x)-min(x)
الخطوة 3) نقوم بإجراء القسمة بين المقام والمقام.
normalize <- nominator/denominator
الخطوة 4) لإرجاع قيمة إلى دالة الاستدعاء، نحتاج إلى تمرير التطبيع داخل return() للحصول على مخرجات الدالة.
return(normalize)
الخطوة 5) نحن على استعداد لاستخدام الوظيفة عن طريق تغليف كل شيء داخل القوس.
normalize <- function(x){
# step 1: create the nominator
nominator <- x-min(x)
# step 2: create the denominator
denominator <- max(x)-min(x)
# step 3: divide nominator by denominator
normalize <- nominator/denominator
# return the value
return(normalize)
}
دعونا نختبر وظيفتنا مع المتغير c1:
normalize(data_frame$c1)
إنه يعمل بشكل مثالي. لقد أنشأنا وظيفتنا الأولى.
الوظائف هي طريقة أكثر شمولاً لأداء مهمة متكررة. يمكننا استخدام صيغة التطبيع على أعمدة مختلفة، كما هو موضح أدناه:
data_frame$c1_norm_function <- normalize (data_frame$c1) data_frame$c2_norm_function <- normalize (data_frame$c2) data_frame$c3_norm_function <- normalize (data_frame$c3)
على الرغم من أن المثال بسيط، إلا أنه يمكننا استنتاج قوة الصيغة. الكود أعلاه أسهل في القراءة ويتجنب بشكل خاص الأخطاء عند لصق الرموز.
وظائف مع الشرط
في بعض الأحيان، نحتاج إلى تضمين شروط في دالة للسماح للكود بإرجاع مخرجات مختلفة.
في مهام التعلم الآلي، نحتاج إلى تقسيم مجموعة البيانات بين مجموعة قطار ومجموعة اختبار. تسمح مجموعة القطار للخوارزمية بالتعلم من البيانات. من أجل اختبار أداء نموذجنا، يمكننا استخدام مجموعة الاختبار لإرجاع مقياس الأداء. ليس لدى R وظيفة لإنشاء مجموعتين من البيانات. يمكننا كتابة دالتنا الخاصة للقيام بذلك. تأخذ وظيفتنا وسيطتين وتسمى Split_data (). الفكرة وراء ذلك بسيطة، حيث نقوم بضرب طول مجموعة البيانات (أي عدد الملاحظات) بـ 0.8. على سبيل المثال، إذا أردنا تقسيم مجموعة البيانات بنسبة 80/20، وكانت مجموعة البيانات الخاصة بنا تحتوي على 100 صف، فسوف تضرب وظيفتنا 0.8*100 = 80. وسيتم اختيار 80 صفًا لتصبح بيانات التدريب الخاصة بنا.
سوف نستخدم مجموعة بيانات جودة الهواء لاختبار الوظيفة المحددة من قبل المستخدم. تحتوي مجموعة بيانات جودة الهواء على 153 صفًا. يمكننا رؤيته من خلال الكود أدناه:
nrow(airquality)
الإخراج:
## [1] 153
سنتصرف على النحو التالي:
split_data <- function(df, train = TRUE) Arguments: -df: Define the dataset -train: Specify if the function returns the train set or test set. By default, set to TRUE
تحتوي دالتنا على وسيطتين. الوسيطة train هي معلمة منطقية. إذا تم تعيينها على TRUE، فإن دالتنا تنشئ مجموعة بيانات train، وإلا فإنها تنشئ مجموعة بيانات الاختبار.
يمكننا المضي قدمًا كما فعلنا مع وظيفة التطبيع (). نكتب الكود كما لو كان رمزًا لمرة واحدة فقط ثم نلف كل شيء مع الشرط في النص لإنشاء الوظيفة.
الخطوة الأولى:
نحن بحاجة لحساب طول مجموعة البيانات. يتم ذلك باستخدام الدالة nrow (). تقوم الدالة Nrow بإرجاع إجمالي عدد الصفوف في مجموعة البيانات. نحن نسمي الطول المتغير.
length<- nrow(airquality) length
الإخراج:
## [1] 153
الخطوة الأولى:
نضرب الطول في 0.8. سيعود عدد الصفوف التي سيتم تحديدها. ينبغي أن يكون 153*0.8 = 122.4
total_row <- length*0.8 total_row
الإخراج:
## [1] 122.4
نريد تحديد 122 صفًا من بين 153 صفًا في مجموعة بيانات جودة الهواء. نقوم بإنشاء قائمة تحتوي على قيم من 1 إلى Total_row. نقوم بتخزين النتيجة في المتغير المسمى سبليت
split <- 1:total_row split[1:5]
الإخراج:
## [1] 1 2 3 4 5
يختار التقسيم أول 122 صفًا من مجموعة البيانات. على سبيل المثال، يمكننا أن نرى أن تقسيم المتغير يجمع القيم 1، 2، 3، 4، 5، وهكذا. ستكون هذه القيم بمثابة الفهرس عندما نختار الصفوف المراد إرجاعها.
الخطوة الأولى:
نحن بحاجة إلى تحديد الصفوف في مجموعة بيانات جودة الهواء بناءً على القيم المخزنة في متغير الانقسام. يتم ذلك على النحو التالي:
train_df <- airquality[split, ] head(train_df)
الإخراج:
##[1] Ozone Solar.R Wind Temp Month Day ##[2] 51 13 137 10.3 76 6 20 ##[3] 15 18 65 13.2 58 5 15 ##[4] 64 32 236 9.2 81 7 3 ##[5] 27 NA NA 8.0 57 5 27 ##[6] 58 NA 47 10.3 73 6 27 ##[7] 44 23 148 8.0 82 6 13
الخطوة الأولى:
يمكننا إنشاء مجموعة بيانات الاختبار باستخدام الصفوف المتبقية، 123:153. يتم ذلك باستخدام – أمام الانقسام.
test_df <- airquality[-split, ] head(test_df)
الإخراج:
##[1] Ozone Solar.R Wind Temp Month Day ##[2] 123 85 188 6.3 94 8 31 ##[3] 124 96 167 6.9 91 9 1 ##[4] 125 78 197 5.1 92 9 2 ##[5] 126 73 183 2.8 93 9 3 ##[6] 127 91 189 4.6 93 9 4 ##[7] 128 47 95 7.4 87 9 5
الخطوة الأولى:
يمكننا إنشاء الشرط داخل نص الوظيفة. تذكر، لدينا مجموعة وسيطات تم تعيينها منطقيًا على TRUE افتراضيًا لإرجاع مجموعة القطارات. لإنشاء الشرط نستخدم صيغة if:
if (train ==TRUE){
train_df <- airquality[split, ]
return(train)
} else {
test_df <- airquality[-split, ]
return(test)
}
هذا هو، يمكننا كتابة الدالة. نحتاج فقط إلى تغيير جودة الهواء إلى df لأننا نريد تجربة وظيفتنا على أي حال إطار البياناتليس فقط جودة الهواء:
split_data <- function(df, train = TRUE){
length<- nrow(df)
total_row <- length *0.8
split <- 1:total_row
if (train ==TRUE){
train_df <- df[split, ]
return(train_df)
} else {
test_df <- df[-split, ]
return(test_df)
}
}
دعونا نجرب وظيفتنا في مجموعة بيانات جودة الهواء. يجب أن يكون لدينا مجموعة قطار واحدة مكونة من 122 صفًا ومجموعة اختبار مكونة من 31 صفًا.
train <- split_data(airquality, train = TRUE) dim(train)
الإخراج:
## [1] 122 6
test <- split_data(airquality, train = FALSE) dim(test)
الإخراج:
## [1] 31 6






