فرز إطار البيانات في لغة R: دالة order() مع مثال

⚡ ملخص ذكي

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

  • 🔢 أساسيات دالة الترتيب (order()): تقوم الدالة order() بإرجاع مؤشرات الصفوف التي تضع عمودًا في تسلسل تصاعدي، وليس القيم المرتبة نفسها.
  • 📌 عمود واحد: df[order(df$c1), ] يعيد ترتيب كل صف من الإطار حسب القيم الموجودة في c1.
  • 🧮 أعمدة متعددة: تعمل الوسائط الإضافية كعوامل فاصلة، لذا فإن order(df$c3, df$c4) يقوم بالفرز حسب c3 ثم حسب c4.
  • ؟؟؟؟ تنازليا: قم بإضافة علامة ناقص إلى عمود رقمي، أو مرر القيمة decreasing = TRUE إلى دالة sort().
  • 🧩 مسار تيديفيرس: تعبر الدالتان arrange() و desc() عن نفس أنواع البيانات التي تعبر عنها أفعال dplyr القابلة للقراءة.
  • ⚠️ قيم مفقودة: تقوم الدالة order() بوضع القيم المفقودة (NA) في النهاية افتراضيًا، بينما تقوم الدالة sort() بإزالة القيم المفقودة ما لم يتم تعيين na.last.

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".

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

استخدم df[order(rownames(df)), ]. أسماء الصفوف نصية، لذا يتبع الفرز ترتيب النصوص، ويظهر الرقم "10" قبل الرقم "2". ضعها داخل as.numeric() عندما تكون رقمية. تحذف الجداول أسماء الصفوف تمامًا، لذا أضف عمود معرف صريحًا بدلاً من ذلك.

مرر قيمة `method = “radix”` إلى الدالة `order()`، وهي أسرع طريقة للتعامل مع الأعداد الصحيحة والسلاسل النصية القصيرة. بالنسبة لملايين الصفوف، تقوم الدالة `data.table::setorder()` بالفرز في مكانها دون نسخ الجدول، كما أن الدالة `arrange()` في مكتبة dplyr تستخدم فرزًا جذريًا داخليًا.

الفهرس ذو التسلسل المعكوس: df[nrow(df):1, ]. هذا يعكس الترتيب الحالي بدلاً من فرزه، وهو أمر مهم عند خلط الإطار أو تجميعه. أعد تعيين التسميات لاحقًا باستخدام rownames(df) <- NULL إذا بدت مُربكة.

يتم تخزين العمود كنص حرفي أو عامل، لذا يقارنه R كنص ويضع "10" قبل "2". تحقق من ذلك باستخدام class(df$col)، ثم حوّله باستخدام as.numeric(as.character(df$col)) قبل الترتيب.

لا، تُعيد الدالة order() متجه فهرس، بينما تُنشئ الدالة df[order(…), ] إطارًا جديدًا، لذا يبقى الإطار الأصلي دون تغيير حتى يتم إعادة تعيين النتيجة. تحتفظ أسماء الصفوف بقيمها القديمة، وهو ما يُعدّ دليلًا مفيدًا على إعادة ترتيب الإطار.

يمكن للمساعدين المدعومين بالذكاء الاصطناعي اكتشاف عمود مُخزّن كنص عندما يبدو فرز البيانات الرقمية غير صحيح، وترجمة استدعاء دالة order() الأساسية في لغة R إلى مسار dplyr، واقتراح عمود ثابت لكسر التعادل. يُنصح دائمًا بتشغيل الكود وفحص دالة head() قبل الوثوق بالنتيجة.

نعم. مساعد الطيار جيثب يعمل هذا البرنامج في RStudio Desktop الإصدار 2023.09.0 والإصدارات الأحدث، ويُكمل استدعاءات الدالتين order() و arrange() من تعليق عادي. يُنبه Posit إلى أن الاقتراحات غير حتمية، لذا يُرجى مراجعة كل سطر قبل تشغيله.

أعد ترتيب فهرس العمود بدلاً من فهرس الصف. يُرتب الأمر `df[, order(names(df))]` الأعمدة أبجديًا، بينما يختار الأمر `df[, c(“c3”, “c1”)]` ترتيبًا صريحًا. يمكن لمستخدمي dplyr استدعاء `select(df, c3, c1)`، الذي يُعيد ترتيب البيانات ويُحدد مجموعات فرعية في خطوة واحدة.

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