R Select()، Filter()، Arrange()، خط الأنابيب مع المثال
تحتوي المكتبة المسماة dplyr على أفعال قيمة للتنقل داخل مجموعة البيانات. من خلال هذا البرنامج التعليمي، ستستخدم مجموعة بيانات أوقات السفر. تقوم مجموعة البيانات بجمع معلومات عن الرحلة التي يقودها السائق بين منزله ومكان عمله. هناك أربعة عشر متغيرًا في مجموعة البيانات، بما في ذلك:
- DayOfWeek: تحديد اليوم من الأسبوع الذي يستخدم فيه السائق سيارته
- المسافة: المسافة الإجمالية للرحلة
- MaxSpeed: السرعة القصوى للرحلة
- الوقت الإجمالي: طول الرحلة بالدقائق
تحتوي مجموعة البيانات على حوالي 200 ملاحظة في مجموعة البيانات، وقد حدثت الرحلات بينهما Monday إلى الجمعة.
أولا وقبل كل شيء، تحتاج إلى:
- تحميل مجموعة البيانات
- التحقق من بنية البيانات.
إحدى الميزات المفيدة في dplyr هي الدالة glimpse() . يعد هذا تحسينًا على str(). يمكننا استخدام glimpse() لرؤية بنية مجموعة البيانات وتحديد المعالجة المطلوبة.
library(dplyr) PATH <- "https://raw.githubusercontent.com/guru99-edu/R-Programming/master/travel_times.csv" df <- read.csv(PATH) glimpse(df)
الإخراج:
## Observations: 205 ## Variables: 14 ## $ X <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, ... ## $ Date <fctr> 1/6/2012, 1/6/2012, 1/4/2012, 1/4/2012, 1/3/20... ## $ StartTime <fctr> 16:37, 08:20, 16:17, 07:53, 18:57, 07:57, 17:3... ## $ DayOfWeek <fctr> Friday, Friday, Wednesday, Wednesday, Tuesday,... ## $ GoingTo <fctr> Home, GSK, Home, GSK, Home, GSK, Home, GSK, GS... ## $ Distance <dbl> 51.29, 51.63, 51.27, 49.17, 51.15, 51.80, 51.37... ## $ MaxSpeed <dbl> 127.4, 130.3, 127.4, 132.3, 136.2, 135.8, 123.2... ## $ AvgSpeed <dbl> 78.3, 81.8, 82.0, 74.2, 83.4, 84.5, 82.9, 77.5,... ## $ AvgMovingSpeed <dbl> 84.8, 88.9, 85.8, 82.9, 88.1, 88.8, 87.3, 85.9,... ## $ FuelEconomy <fctr> , , , , , , -, -, 8.89, 8.89, 8.89, 8.89, 8.89... ## $ TotalTime <dbl> 39.3, 37.9, 37.5, 39.8, 36.8, 36.8, 37.2, 37.9,... ## $ MovingTime <dbl> 36.3, 34.9, 35.9, 35.6, 34.8, 35.0, 35.3, 34.3,... ## $ Take407All <fctr> No, No, No, No, No, No, No, No, No, No, No, No... ## $ Comments <fctr> , , , , , , , , , , , , , , , Put snow tires o...
من الواضح أن المتغير Comments يحتاج إلى مزيد من التشخيص. الملاحظات الأولى لمتغير التعليقات هي قيم مفقودة فقط.
sum(df$Comments =="")
شرح الكود
- sum(df$Comments ==””): جمع الملاحظات يساوي “” في تعليقات العمود من df
الإخراج:
## [1] 181
تحديد()
سنبدأ مع الفعل Select(). لا نحتاج بالضرورة إلى جميع المتغيرات، ومن الممارسات الجيدة أن تختار فقط المتغيرات التي تجدها ذات صلة.
لدينا 181 ملاحظة مفقودة، أي ما يقرب من 90% من مجموعة البيانات. إذا قررت استبعادهم، فلن تتمكن من مواصلة التحليل.
الاحتمال الآخر هو إسقاط المتغير Comment باستخدام الفعل Select() .
يمكننا تحديد المتغيرات بطرق مختلفة باستخدام التحديد (). لاحظ أن الوسيطة الأولى هي مجموعة البيانات.
- `select(df, A, B ,C)`: Select the variables A, B and C from df dataset. - `select(df, A:C)`: Select all variables from A to C from df dataset. - `select(df, -C)`: Exclude C from the dataset from df dataset.
يمكنك استخدام الطريقة الثالثة لاستبعاد متغير التعليقات.
step_1_df <- select(df, -Comments) dim(df)
الإخراج:
## [1] 205 14
dim(step_1_df)
الإخراج:
## [1] 205 13
تحتوي مجموعة البيانات الأصلية على 14 ميزة بينما تحتوي step_1_df على 13.
منقي()
يساعد الفعل filter() في الحفاظ على الملاحظات وفقًا لمعايير معينة. يعمل الفعل filter() تمامًا مثل select()، حيث تقوم أولاً بتمرير إطار البيانات ثم شرط مفصول بفاصلة:
filter(df, condition) arguments: - df: dataset used to filter the data - condition: Condition used to filter the data
معايير واحدة
أولًا، يمكنك حساب عدد الملاحظات ضمن كل مستوى لمتغير العامل.
table(step_1_df$GoingTo)
شرح الكود
- الجدول (): حساب عدد الملاحظات حسب المستوى. لاحظ أنه يتم قبول متغير مستوى العامل فقط
- table(step_1_df$GoingTo): احسب عدد الرحلات نحو الوجهة النهائية.
الإخراج:
## ## GSK Home ## 105 100
يشير جدول الوظائف () إلى أن 105 رحلة متجهة إلى GSK و100 رحلة إلى المنزل.
يمكننا تصفية البيانات لإرجاع مجموعة بيانات واحدة تحتوي على 105 ملاحظة وأخرى تحتوي على 100 ملاحظة.
# Select observations if GoingTo == Home select_home <- filter(df, GoingTo == "Home") dim(select_home)
الإخراج:
## [1] 100 14
# Select observations if GoingTo == Work select_work <- filter(df, GoingTo == "GSK") dim(select_work)
الإخراج:
## [1] 105 14
معايير متعددة
يمكننا تصفية مجموعة بيانات بأكثر من معيار واحد. على سبيل المثال، يمكنك استخراج الملاحظات حيث تكون الوجهة هي المنزل وحدثت يوم الأربعاء.
select_home_wed <- filter(df, GoingTo == "Home" & DayOfWeek == "Wednesday") dim(select_home_wed)
الإخراج:
## [1] 23 14
23 ملاحظة مطابقة لهذا المعيار.
خط أنابيب
يتطلب إنشاء مجموعة البيانات الكثير من العمليات، مثل:
- استيراد
- دمج
- اختيار
- تصفية
- وما إلى ذلك وهلم جرا
تأتي مكتبة dplyr مع عامل عملي، %>%، يسمى خط أنابيب. تعمل ميزة خط الأنابيب على جعل المعالجة نظيفة وسريعة وأقل عرضة للخطأ.
هذا المشغل عبارة عن كود يقوم بتنفيذ الخطوات دون حفظ الخطوات الوسيطة على القرص الصلب. إذا عدت إلى مثالنا أعلاه، فيمكنك تحديد المتغيرات التي تهمك وتصفيتها. لدينا ثلاث خطوات:
- الخطوة 1: استيراد البيانات: استيراد بيانات نظام تحديد المواقع
- الخطوة 2: تحديد البيانات: حدد GoingTo وDayOfWeek
- الخطوة 3: تصفية البيانات: العودة إلى المنزل والأربعاء فقط
يمكننا استخدام الطريقة الصعبة للقيام بذلك:
# Step 1 step_1 <- read.csv(PATH) # Step 2 step_2 <- select(step_1, GoingTo, DayOfWeek) # Step 3 step_3 <- filter(step_2, GoingTo == "Home", DayOfWeek == "Wednesday") head(step_3)
الإخراج:
## GoingTo DayOfWeek ## 1 Home Wednesday ## 2 Home Wednesday ## 3 Home Wednesday ## 4 Home Wednesday ## 5 Home Wednesday ## 6 Home Wednesday
هذه ليست طريقة ملائمة لإجراء العديد من العمليات، خاصة في المواقف التي تتضمن الكثير من الخطوات. وتنتهي البيئة بتخزين الكثير من الكائنات.
دعنا نستخدم عامل خط الأنابيب %>% بدلاً من ذلك. نحتاج فقط إلى تعريف إطار البيانات المستخدم في البداية وستتدفق العملية بأكملها منه.
بناء الجملة الأساسي لخط الأنابيب
New_df <- df %>% step 1 %>% step 2 %>% ... arguments - New_df: Name of the new data frame - df: Data frame used to compute the step - step: Instruction for each step - Note: The last instruction does not need the pipe operator `%`, you don't have instructions to pipe anymore Note: Create a new variable is optional. If not included, the output will be displayed in the console.
يمكنك إنشاء الأنبوب الأول الخاص بك باتباع الخطوات المذكورة أعلاه.
# Create the data frame filter_home_wed.It will be the object return at the end of the pipeline filter_home_wed <- #Step 1 read.csv(PATH) % > % #Step 2 select(GoingTo, DayOfWeek) % > % #Step 3 filter(GoingTo == "Home",DayOfWeek == "Wednesday") identical(step_3, filter_home_wed)
الإخراج:
## [1] TRUE
نحن على استعداد لإنشاء مجموعة بيانات مذهلة مع مشغل خط الأنابيب.
يرتب()
في مجلة البرنامج التعليمي السابقستتعلم كيفية فرز القيم باستخدام الدالةsort(). مكتبة dplyr لها وظيفة الفرز الخاصة بها. إنه يعمل مثل السحر مع خط الأنابيب. يمكن للفعل الترتيبي () إعادة ترتيب صف واحد أو عدة صفوف، إما تصاعديًا (افتراضيًا) أو تنازليًا.
- `arrange(A)`: Ascending sort of variable A - `arrange(A, B)`: Ascending sort of variable A and B - `arrange(desc(A), B)`: Descending sort of variable A and ascending sort of B
يمكننا فرز المسافة حسب الوجهة.
# Sort by destination and distance step_2_df <-step_1_df %>% arrange(GoingTo, Distance) head<step_2_df)
الإخراج:
## X Date StartTime DayOfWeek GoingTo Distance MaxSpeed AvgSpeed ## 1 193 7/25/2011 08:06 Monday GSK 48.32 121.2 63.4 ## 2 196 7/21/2011 07:59 Thursday GSK 48.35 129.3 81.5 ## 3 198 7/20/2011 08:24 Wednesday GSK 48.50 125.8 75.7 ## 4 189 7/27/2011 08:15 Wednesday GSK 48.82 124.5 70.4 ## 5 95 10/11/2011 08:25 Tuesday GSK 48.94 130.8 85.7 ## 6 171 8/10/2011 08:13 Wednesday GSK 48.98 124.8 72.8 ## AvgMovingSpeed FuelEconomy TotalTime MovingTime Take407All ## 1 78.4 8.45 45.7 37.0 No ## 2 89.0 8.28 35.6 32.6 Yes ## 3 87.3 7.89 38.5 33.3 Yes ## 4 77.8 8.45 41.6 37.6 No ## 5 93.2 7.81 34.3 31.5 Yes ## 6 78.8 8.54 40.4 37.3 No
الملخص
في الجدول أدناه، يمكنك تلخيص جميع العمليات التي تعلمتها أثناء البرنامج التعليمي.
الفعل | هدف | رمز | تفسير |
---|---|---|---|
لمحة | تحقق من بنية df |
glimpse(df) |
مطابق للسلسلة () |
تحديد() | تحديد/استبعاد المتغيرات |
select(df, A, B ,C) |
حدد المتغيرات A وB وC |
select(df, A:C) |
حدد جميع المتغيرات من A إلى C | ||
select(df, -C) |
استبعاد ج | ||
منقي() | قم بتصفية df بناءً على شرط واحد أو عدة شروط |
filter(df, condition1) |
شرط واحد |
filter(df, condition1 |
شرط2) | ||
يرتب() | قم بفرز مجموعة البيانات بمتغير واحد أو أكثر |
arrange(A) |
النوع التصاعدي للمتغير A |
arrange(A, B) |
النوع التصاعدي للمتغير A و B | ||
arrange(desc(A), B) |
النوع التنازلي للمتغير A والنوع التصاعدي للمتغير B | ||
%>% | إنشاء خط أنابيب بين كل خطوة |
step 1 %>% step 2 %>% step 3 |