فرز إطار البيانات في لغة R: دالة order() مع مثال
⚡ ملخص ذكي
تعتمد عملية فرز إطار البيانات في لغة R على الدالة order()، التي تُعيد مواقع الصفوف بدلاً من قيمها. يؤدي تمرير هذه المواقع داخل أقواس مربعة إلى إعادة ترتيب الصفوف بمقدار عمود واحد، أو عدة أعمدة، أو بترتيب تنازلي.

فرز البيانات في لغة R
في تحليل البيانات يمكنك sort بياناتك وفقًا لمتغير معين في مجموعة البيانات. في R، يمكننا استخدام مساعدة ترتيب الدالة (). في R، يمكننا بسهولة فرز متجه المتغير المستمر أو متغير العامل. ترتيب البيانات يمكن أن يكون من تصاعدي or تنازلي النظام.
بناء الجملة:
sort(x, decreasing = FALSE, na.last = NA)
جدال:
- xمتجه يحتوي على متغير مستمر أو متغير عاملي
- تقليليتحكم هذا الخيار في اتجاه الفرز. افتراضيًا، يكون الترتيب التنازلي مضبوطًا على "خطأ"، مما يعطي ترتيبًا تصاعديًا.
- na.lastيشير هذا الخيار إلى ما إذا كان ينبغي وضع القيم المفقودة (NA) في النهاية أم لا. تستخدم الدالة sort() القيمة NA افتراضيًا، مما يؤدي إلى حذف القيم المفقودة؛ بينما تستخدم الدالة order() القيمة TRUE، مما يؤدي إلى الاحتفاظ بها ووضعها في النهاية.
مقارنة بين sort() و order() و rank() في لغة R
الصيغة المذكورة أعلاه خاصة بالدالة sort()، ومع ذلك، فإن كل مثال في هذه الصفحة يستدعي الدالة order(). تجيب الدالتان على أسئلة مختلفة، والخلط بينهما هو السبب الأكثر شيوعًا لفشل عملية الفرز ظاهريًا. وتُكمل الدالة rank() هذه المجموعة.
| الوظيفة | سياسات الإرجاع والاستبدال | استخدمه عندما | معالجة القيم المفقودة افتراضياً |
|---|---|---|---|
| فرز() | القيم نفسها، بالترتيب | كل ما تحتاجه هو متجه مُرتب | na.last = NA، لذلك يتم إسقاط NA |
| طلب() | مواقع الصفوف التي تُنتج الترتيب المُرتب | أنت بحاجة إلى إعادة ترتيب إطار البيانات بالكامل | na.last = TRUE، لذا فإن NA تأتي في النهاية |
| رتبة() | رتبة كل عنصر في موضعه الأصلي | أنت بحاجة إلى عمود تصنيف، وليس جدولًا معاد ترتيبه | na.last = TRUE |
لأن الدالة order() تُرجع المواضع، فهي الوحيدة من بين الدوال الثلاث التي يمكنها تحديد مجموعة العناصر الفرعية بين الأقواس المربعة المستخدمة في هذه الصفحة. توثيق R الأساسي للدالة order() يسرد كل وسيط، بما في ذلك وسيط الطريقة الذي يحدد خوارزمية الفرز.
مثال 1: فرز إطار البيانات حسب عمود واحد
على سبيل المثال، يمكننا إنشاء إطار بيانات tibble وفرز متغير واحد أو عدة متغيرات. إطار بيانات tibble هو شكل حديث من أشكال... إطار البياناتيُحسّن هذا الأسلوب بنية إطار البيانات ويتجنب مشاكل تنسيق أنواع البيانات، وخاصةً تحويل الأحرف إلى عوامل. كما أنه طريقة سهلة لإنشاء إطار بيانات يدويًا، وهو هدفنا هنا. لمعرفة المزيد عن tibble، يُرجى مراجعة الشرح المختصر. https://tibble.tidyverse.org/articles/tibble.html
يقوم الكود أدناه بإنشاء جدول بيانات مكون من 50 صفًا من خمسة أعمدة عشوائية، ثم يقوم بفرز كل صف حسب القيم الموجودة في العمود c1. تقوم الدالة set.seed(1234) بإصلاح عملية السحب العشوائي، بحيث تظهر نفس الأرقام على أي جهاز.
library(dplyr) set.seed(1234) data_frame <- tibble( c1 = rnorm(50, 5, 1.5), c2 = rnorm(50, 5, 1.5), c3 = rnorm(50, 5, 1.5), c4 = rnorm(50, 5, 1.5), c5 = rnorm(50, 5, 1.5) ) # Sort by c1 df <-data_frame[order(data_frame$c1),] head(df)
الإخراج:
# A tibble: 6 x 5 ## c1 c2 c3 c4 c5 ## <dbl> <dbl> <dbl> <dbl> <dbl> ## 1 1.481453 3.477557 4.246283 3.686611 6.0511003 ## 2 1.729941 5.824996 4.525823 6.753663 0.1502718 ## 3 2.556360 6.275348 2.524849 6.368483 5.4787404 ## 4 2.827693 4.769902 5.120089 3.743626 4.0103449 ## 5 2.988510 4.395902 2.077631 4.236894 4.6176880 ## 6 3.122021 6.317305 5.413840 3.551145 5.6067027
الفاصلة قبل القوس المغلق مهمة: df[order(…), ] يعيد ترتيب الصفوف، بينما df[, order(…)] يعيد ترتيب الأعمدة بدلاً من ذلك.
مثال 2: الفرز حسب أعمدة متعددة
كل وسيط إضافي يُمرر إلى دالة order() يعمل كمعيار فاصل للوسيط الذي يسبقه. هنا، يتم فرز الإطار حسب c3، ثم يتم ترتيب الصفوف التي تشترك في نفس قيمة c3 حسب c4.
# Sort by c3 and c4
df <-data_frame[order(data_frame$c3, data_frame$c4),]
head(df)
الإخراج:
# A tibble: 6 x 5 ## c1 c2 c3 c4 c5 ## <dbl> <dbl> <dbl> <dbl> <dbl> ## 1 2.988510 4.395902 2.077631 4.236894 4.617688 ## 2 2.556360 6.275348 2.524849 6.368483 5.478740 ## 3 3.464516 3.914627 2.730068 9.565649 6.016123 ## 4 4.233486 3.292088 3.133568 7.517309 4.772395 ## 5 3.935840 2.941547 3.242078 6.464048 3.599745 ## 6 3.835619 4.947859 3.335349 4.378370 7.240240
المثال 3: فرز عمود واحد تنازليًا وآخر تصاعديًا
يمكن لكل عمود أن يحمل اتجاهه الخاص. يؤدي وضع علامة ناقص قبل عمود رقمي إلى عكس اتجاه ذلك العمود فقط، لذا فإن الفرز أدناه يعمل تنازليًا بدءًا من العمود c3 وتصاعديًا بدءًا من العمود c4.
# Sort by c3(descending) and c4(ascending)
df <-data_frame[order(-data_frame$c3, data_frame$c4),]
head(df)
الإخراج:
# A tibble: 6 x 5 ## c1 c2 c3 c4 c5 ## <dbl> <dbl> <dbl> <dbl> <dbl> ## 1 4.339178 4.450214 8.087243 4.5010140 8.410225 ## 2 3.959420 8.105406 7.736312 7.1168936 5.431565 ## 3 3.339023 3.298088 7.494285 5.9303153 7.035912 ## 4 3.397036 5.382794 7.092722 0.7163620 5.620098 ## 5 6.653446 4.733315 6.520536 0.9016707 4.513410 ## 6 4.558559 4.712609 6.380086 6.0562703 5.044277
لا تعمل حيلة علامة الطرح إلا مع الأعمدة الرقمية. أما بالنسبة لأعمدة الأحرف أو العوامل، فاستخدم الدالة order(xtfrm(df$col), decreasing = TRUE)، أو انتقل إلى طريقة dplyr الموضحة لاحقًا.
فرز إطار البيانات باستخدام دالة dplyr arrange()
يصبح استخدام الأقواس المربعة صعب القراءة عند التعامل مع عدة أعمدة واتجاهات، لأن اسم الإطار يتكرر داخل كل وسيط. com.dplyr تقوم الدالة `arrange()` بإزالة هذا التكرار: حيث يتم تسمية الأعمدة مرة واحدة، وتقوم الدالة `desc()` بتحديد الأعمدة التي تعمل بشكل عكسي.
library(dplyr) # The same three sorts written with arrange() data_frame %>% arrange(c1) # Example 1 data_frame %>% arrange(c3, c4) # Example 2 data_frame %>% arrange(desc(c3), c4) # Example 3
ثلاثة اختلافات عملية جديرة بالمعرفة:
- قراءة: يصرح الترتيب (desc(c3), c4) بالنية مباشرة، بينما يخفيها الترتيب (-data_frame$c3, data_frame$c4) خلف علامة ناقص.
- أنواع الأعمدة: تعمل الدالة desc() على أعمدة الأحرف والعوامل بالإضافة إلى الأعمدة الرقمية، لذلك لا حاجة إلى حل بديل باستخدام xtfrm().
- قيم مفقودة: تقوم الدالة arrange() دائمًا بوضع القيم NA في النهاية، بغض النظر عن الاتجاه، بينما تتيح لك الدالة order() نقلها باستخدام na.last.
تُعيد الدالة `arrange()` إطار بيانات جديدًا دون تغيير الإطار الأصلي، تمامًا كما في حالة الإطار ذي الأقواس المربعة، لذا يجب تسمية النتيجة للاحتفاظ بها. يتم فرز الإطارات المُجمّعة داخل كل مجموعة فقط عند تحديد `.by_group = TRUE`.
فرز الأحرف والعوامل والقيم المفقودة في لغة R
يتم فرز الأعمدة الرقمية بشكل متوقع. أما النصوص والفئات والفراغات فلا يتم فرزها بشكل متوقع، ويتطلب كل منها قرارًا مختلفًا.
القيم المفقودة. تختلف الدالتان sort() و order() في كيفية التعامل مع القيم المفقودة (NA)، ولهذا السبب يمكن أن ينتج عن نفس العمود عددان مختلفان من الصفوف:
x <- c(3, NA, 1, 2) sort(x) # missing values dropped sort(x, na.last = TRUE) # missing values pushed to the end order(x) # NA indexed last by default order(x, na.last = FALSE) # NA indexed first
عوامل. A عامل يتم الفرز حسب ترتيب المستوى، وليس أبجديًا. هذا هو المطلوب تمامًا للفئات المرتبة مثل منخفض ومتوسط وعالي، وهو ما لا تريده على الإطلاق إذا تم إنشاء المستويات بالترتيب الذي ظهرت به القيم.
grades <- factor(c("low", "high", "medium"), levels = c("low", "medium", "high")) sort(grades) # follows the level order sort(as.character(grades)) # plain alphabetical order
أعمدة الأحرف. يتم فرز النصوص العادية وفقًا لترتيب اللغة، لذا قد تختلف النتائج بين الأجهزة بسبب اختلاف الأحرف الكبيرة والصغيرة وعلامات التشكيل. لتجنب المفاجآت، يُنصح باتباع عادتين: التحقق من نوع البيانات (df$col) قبل الفرز، وتحويل الأرقام المخزنة كنص باستخدام as.numeric() بحيث لا يظهر الرقم "10" قبل الرقم "2".
