Introduction à la manipulation de données (dplyR) S. CHAMPELY Université Lyon 1
Le package dplyR Créé par Hadley Wickham et Romain Francois Une “grammaire” pour la manipulation de données… De la même façon que ggplot2 est une “grammaire” pour les graphiques
Les objets tbl Du data.frame au tbl_df > library(MASS) > data(survey) > head(survey) > class(survey) > library(dplyr) > survey2<-tbl_df(survey) > print(survey2) > glimpse(survey2) > class(survey2) [1] "tbl_df" "tbl" "data.frame"
Les « verbes » principaux filter() arrange() select() distinct() mutate() summarise() sample_n() ; sample_frac()
Filtrage > filter(survey2, Sex=="Female", Pulse==80) [et] > filter(survey2,Sex=="Female" | Pulse==80) [ou] > filter(survey2, Pulse>80, Pulse<85) Équivalent à subset dans R
Ordonner arrange(survey2,Pulse,Sex) (ordre croissant) arrange(survey2,desc(Pulse),Sex) (décroissant)
Sélection de colonnes > select(survey2,Sex,Height) (REM :il peut y avoir une mauvaise surprise entre MASS et dplyr à cause de select qui est dans les deux packages) > select(survey2,Sex:Pulse)
Nouvelles colonnes mutate(survey2,diff=abs(Wr.Hnd-NW.Hnd))
Faire un résumé > summarise(survey2,main=mean(Wr.Hnd)) Ah oui… les données manquantes > summarise(survey2, main=mean(Wr.Hnd,na.rm=TRUE)) Un résumé un peu court… > summarise(survey2, Mmain=mean(Wr.Hnd,na.rm=TRUE), SDmain=sd(Wr.Hnd,na.rm=TRUE)) Les fonctions avec lesquelles il est possible de jouer : Les classiques : min(), max(), mean(), sum(), sd(), median(), and IQR() mais aussi dans dplyr: n(), n_distinct(), first(x), last(x) et nth(x, n) Mais au fond, cela sert à quoi par rapport à summary ?
Données groupées > fumer <- group_by(survey2, Smoke) > summarise(fumer, Mmain=mean(Wr.Hnd,na.rm=TRUE), SDmain=sd(Wr.Hnd,na.rm=TRUE)) > summarise(fumer, Mmain=mean(Wr.Hnd,na.rm=TRUE), SDmain=sd(Wr.Hnd,na.rm=TRUE), Nombre=n()) > fumer2 <- group_by(survey2, Smoke, Sex) > summarise(fumer2, Mmain=mean(Wr.Hnd,na.rm=TRUE), SDmain=sd(Wr.Hnd,na.rm=TRUE), Nombre=n())
Enchaîner les opérations > t1 60) > t2<-mutate(t1,diff=abs(Wr.Hnd-NW.Hnd)) > t3<-group_by(t2,Sex,W.Hnd) > t4<-summarise(t3,Mmain=mean(Wr.Hnd,na.rm=TRUE),Dmain=mean(diff,na.rm=TRUE),Nombre=n()) OU ALORS > summarise( group_by( mutate( dplyr::select(survey2,Pulse>60),diff=abs(Wr.Hnd-NW.Hnd)),Sex,W.Hnd),Mmain=mean(Wr.Hnd,na.rm=TRUE),Dmain=mean(diff,na.rm=TRUE),Nombre=n()) OU ALORS AVEC UN OPERATEUR DE « PIPE » > survey2 %>% dplyr::select(Pulse>60) %>% mutate(diff=abs(Wr.Hnd-NW.Hnd)) %>% group_by(Sex,W.Hnd) %>% summarise(Mmain=mean(Wr.Hnd,na.rm=TRUE),Dmain=mean(diff,na.rm=TRUE),Nombre=n())