פרק 7 - tidyverse

tidyverse היא חבילה שמאגדת תחתיה מספר תתי חבילות שמשמשות כולן לניתוח נתונים. עיקר השימוש שלנו יהיה:
1. בחבילה dplyr שמסייעת לבצע מניפולציות על מידע
2. בחבילה ggplot2 שמסייעת להציג מידע בצורה גרפית

# install the library tidyverse if it is not already installed
if (!require("tidyverse")) install.packages("tidyverse")
# load the library tidyverse
library("tidyverse")
# install the library tidylog if it is not already installed
if (!require("tidylog")) install.packages("tidylog")
# load the library tidylog
library("tidylog")

Pipe

הספרייה dplyr, אשר נמצאת תחת tidyverse, מגדירה אופרטור חדש שנקרא - Pipe.

# ******     %>%     ****** 

some_data %>% some_function()

# the code above is equivalent to this:
some_function(some_data)

המידע שנמצא משמאל לאופרטור מועבר כקלט לפונקציה שנמצאת מימינו. לכן הוא משמש כצינור. בעבודה עם dataframes השימוש באופרטור נוח ומקל על ניתוח ועיבוד הנתונים. אשתמש ב-Pipe כדי להדגים פונקציות נוספות תחת tidyverse ולכן חשוב להכיר אותו.
דוגמא פשוטה: ניקח וקטור של המספרים מ1 עד 8, ונעביר אותו בעזרת Pipe לפונקציה sum.

library("dplyr")
1:8 %>% sum()
## [1] 36
# or:
#              1:8 %>% sum
# both valid

במילים פשוטות - הפונקציה sum קיבלה את הוקטור כקלט. כלומר, הכתיבה הבאה הייתה מחזירה תוצאה זהה:

sum(1:8)
## [1] 36

ניתן להשתמש באופרטור מספר פעמים כרצוננו

vec1 <- c(1.3,2.4,3.1,4,5)
rounded_sum <- vec1 %>%
   sum() %>%
   round()

# the same as:
rounded_sum_old_way <- round(sum(vec1))

read.csv

הפונקציה read.csv מקבלת קובץ csv ומחזירה אובייקט מסוג data.frame
הערה: זאת פונקציה בסיסית שלא שייכת ל-Tidyverse אך ניעזר בה כדי לקרוא את קובץ הנתונים איתו נעבוד.
בדוגמאות הבאות נעבוד עם קובץ הנתונים cereal.csv

הורד את הקובץ cereal.csv

cereal_df <- read.csv(file = 'cereal.csv')
head(cereal_df)
##                        name calories sodium potass   rating
## 1                 100% Bran       70    130    280 68.40297
## 2         100% Natural Bran      120     15    135 33.98368
## 3                  All-Bran       70    260    320 59.42551
## 4 All-Bran with Extra Fiber       50    140    330 93.70491
## 5            Almond Delight      110    200     -1 34.38484
## 6   Apple Cinnamon Cheerios      110    180     70 29.50954
summary(cereal_df)
##      name             calories             sodium          potass      
##  Length:77          Length:77          Min.   :  0.0   Min.   : -1.00  
##  Class :character   Class :character   1st Qu.:125.0   1st Qu.: 35.00  
##  Mode  :character   Mode  :character   Median :180.0   Median : 85.00  
##                                        Mean   :154.6   Mean   : 89.64  
##                                        3rd Qu.:210.0   3rd Qu.:110.00  
##                                        Max.   :320.0   Max.   :330.00  
##      rating     
##  Min.   : 1.00  
##  1st Qu.:31.23  
##  Median :40.11  
##  Mean   :41.25  
##  3rd Qu.:50.83  
##  Max.   :93.70

filter

הפונקציה filter מחזירה רק ערכים העומדים בתנאי מסוים.
בדוגמא הבאה הפונקציה filter מקבלת כקלט את cereal_df ותנאי. מתוך cereal_df יחזרו רק השורות שבהן המשתנה rating גדול מ-70. את הפלט של הפונקציה נכניס לתוך משתנה חדש: cereal_df_filtered

cereal_df_filtered <- cereal_df %>% filter(rating > 70)
## filter: removed 74 rows (96%), 3 rows remaining
head(cereal_df_filtered)
##                        name calories sodium potass   rating
## 1 All-Bran with Extra Fiber       50    140    330 93.70491
## 2    Shredded Wheat 'n'Bran       90      0    140 74.47295
## 3 Shredded Wheat spoon size       90      0    120 72.80179

mutate

הפונקציה mutate מאפשרת ליצור עמודות חדשות בdf או לערוך עמודות קיימות.

cereal_df <- read.csv(file = 'cereal.csv')
cereal_df <- cereal_df %>% mutate(
  high_clorie = case_when(
    as.numeric(calories) > 80 ~ TRUE,
    as.numeric(calories) <= 80 ~ FALSE,
    TRUE ~ NA
))
## mutate: new variable 'high_clorie' (logical) with 3 unique values and 4% NA
head(cereal_df)
##                        name calories sodium potass   rating high_clorie
## 1                 100% Bran       70    130    280 68.40297       FALSE
## 2         100% Natural Bran      120     15    135 33.98368        TRUE
## 3                  All-Bran       70    260    320 59.42551       FALSE
## 4 All-Bran with Extra Fiber       50    140    330 93.70491       FALSE
## 5            Almond Delight      110    200     -1 34.38484        TRUE
## 6   Apple Cinnamon Cheerios      110    180     70 29.50954        TRUE

select

הפונקציה select מאפשרת לבחור עמודות מסוימות מתוך data.frame. הפונקציה מקבלת data.frame ורשימה של עמודות (או תנאי הנוגע אליהן) כקלט ומחזירה את אותו data.frame, רק עם אותן עמודות.
בדוגמא הבאה ניקח מתוך cereal_df את העמודות calories ו- sodium בלבד.

cereal_df <- read.csv(file = 'cereal.csv')
cereal_df <- cereal_df %>% select(c(calories, sodium))
## select: dropped 3 variables (name, potass, rating)
colnames(cereal_df)
## [1] "calories" "sodium"

sample_frac

הפונקציה sample_frac מאפשר לדגום אחוז מסוים של ערכים מתוך data.frame.
בדוגמא הבאה נדגום 40% מהשורות מתוך cereal_df.

cereal_df <- read.csv(file = 'cereal.csv')
cereal_df <- cereal_df %>% sample_frac(0.4)
## sample_frac: removed 46 rows (60%), 31 rows remaining