الدوال المخصصة
الدرس 14 من 14 في دورة معالجة البيانات في R على Coddy.
تعد الوظائف المخصصة في R أدوات قوية لإنشاء كود قابل لإعادة الاستخدام وإجراء تحويلات معقدة للبيانات. فهي تتيح لك تغليف سلسلة من العمليات في وحدة واحدة قابلة للاستدعاء. دعنا نستكشف كيفية إنشاء واستخدام الوظائف المخصصة لمهام معالجة البيانات.
الهيكل الأساسي للوظيفة المخصصة
الصيغة الأساسية لإنشاء وظيفة مخصصة في R هي:
function_name <- function(arg1, arg2, ...) {
# جسم الوظيفة
# العمليات باستخدام arg1، arg2، إلخ.
return(result)
}إنشاء وظيفة مخصصة بسيطة
لنقم بإنشاء وظيفة بسيطة تحسب النسبة المئوية للقيم المفقودة في متجه:
percent_missing <- function(x) {
sum(is.na(x)) / length(x) * 100
}
# الاستخدام
data <- c(1, 2, NA, 4, NA, 6)
percent_missing(data) # تعيد: 33.33333الوظائف ذات الوسائط المتعددة
يمكن للوظائف المخصصة أن تأخذ وسائط متعددة، مما يسمح بعمليات أكثر مرونة:
scale_column <- function(df, column_name, min_val = 0, max_val = 1) {
df[[column_name]] <- (df[[column_name]] - min(df[[column_name]], na.rm = TRUE)) /
(max(df[[column_name]], na.rm = TRUE) - min(df[[column_name]], na.rm = TRUE))
df[[column_name]] <- df[[column_name]] * (max_val - min_val) + min_val
return(df)
}
# الاستخدام
df <- data.frame(x = 1:10, y = 11:20)
scaled_df <- scale_column(df, "x", 0, 100)إرجاع قيم متعددة
يمكن للوظائف إرجاع قيم متعددة باستخدام قائمة:
summarize_numeric <- function(x) {
list(
mean = mean(x, na.rm = TRUE),
median = median(x, na.rm = TRUE),
sd = sd(x, na.rm = TRUE)
)
}
# الاستخدام
numbers <- c(1, 2, 3, 4, 5)
summary_stats <- summarize_numeric(numbers)استخدام الوظائف المخصصة مع dplyr
يمكن أن تكون الوظائف المخصصة مفيدة بشكل خاص عند دمجها مع dplyr لمعالجة البيانات:
library(dplyr)
categorize_age <- function(age) {
case_when(
age < 18 ~ "Child",
age < 65 ~ "Adult",
TRUE ~ "Senior"
)
}
# الاستخدام مع dplyr
df <- data.frame(name = c("Alice", "Bob", "Charlie"), age = c(25, 72, 16))
df %>%
mutate(age_category = categorize_age(age))يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
التحدي
متوسطقم بإنشاء وظيفة مخصصة تسمى mean_score تحسب متوسط الدرجات لكل طالب في مجموعة بيانات لدرجات امتحانات الطلاب.
لحساب متوسط الدرجات عبر كل صف، سنستخدم وظيفة rowwise() ولاحقاً سنستخدم ungroup() لإعادة كل شيء إلى ما كان عليه. تحقق من الكود المقدم.
قم بتنفيذ الإجراءات التالية:
- قم بإنشاء عمود جديد يسمى
student_meanيحتوي على متوسط الدرجات. - قم بإنشاء عمود جديد يسمى
is_above_meanيحتوي على TRUE أو FALSE إذا كان الطالب أعلى أو أقل من المتوسط. - قم بإنشاء عمود يسمى
rankيحتوي على ترتيب كل طالب بالنسبة للآخرين بناءً على متوسط درجاتهم. على سبيل المثال، 1 تعني أن الطالب هو الأفضل، 2 تعني أن الطالب هو الثاني في الترتيب، وهكذا.- لإيجاد الترتيب (rank) استخدم
order():order(order(mean_col, decreasing = TRUE))
- لإيجاد الترتيب (rank) استخدم
جرّب بنفسك
# قراءة المدخلات
con <- file("stdin", "r")
input_data <- readLines(con)
close(con)
# معالجة بيانات المدخلات وتحويلها إلى إطار بيانات (data frame)
data <- read.csv(text = input_data, header = TRUE, stringsAsFactors = FALSE)
# تعريف دالة mean_score
mean_score <- function(data) {
# TODO: اكتب كودك هنا
# حساب المتوسط لجميع المواد
return(result)
}
# TODO: اكتب كودك هنا
# إنشاء عمود جديد باسم student_mean يحتوي على متوسط الدرجات.
# إنشاء عمود جديد باسم is_above_mean يحتوي على TRUE أو FALSE إذا كان الطالب فوق أو تحت المتوسط.
# إنشاء عمود باسم rank يحتوي على ترتيب كل طالب بالنسبة للآخرين بناءً على متوسطهم. على سبيل المثال، 1 يعني أن الطالب هو الأفضل، 2 يعني أن الطالب هو الثاني، وهكذا.
# طباعة النتيجة
print(data)