R est le sucesseur du language s+ Sorti dans les années 2000, il est principalement utilisé comme une alternative de matlab dans le monde statistiques Programmation vectorielle dans le but d’éviter les boucles
Pour les utilisateurs matlab ou python http://mathesaurus.sourceforge.net/octave-r.html
Une data frame est une structure de données en deux dimensions, avec les individus (observations) en lignes et les différentes variables en colonnes.
Les ensembles de données peuvent être de différents types (Boolean,numeric,character…).
De nombreuses petites fonctions utiles sont disponibles et permettent de “visualiser” notre data frame.
La fonction dim
nous renvoie les dimensions, la fonction head
affiche les premières observations d’une data frame ou une variabme.
La fonction names
renvoie les noms de variables, la fonction str
un résumé des variables avec leur type, la fonction summary
un résumé numérique.
## [1] 578 4
## weight Time Chick Diet
## 1 42 0 1 1
## 2 51 2 1 1
## 3 59 4 1 1
## 4 64 6 1 1
## 5 76 8 1 1
## 6 93 10 1 1
## [1] "weight" "Time" "Chick" "Diet"
## Classes 'nfnGroupedData', 'nfGroupedData', 'groupedData' and 'data.frame': 578 obs. of 4 variables:
## $ weight: num 42 51 59 64 76 93 106 125 149 171 ...
## $ Time : num 0 2 4 6 8 10 12 14 16 18 ...
## $ Chick : Ord.factor w/ 50 levels "18"<"16"<"15"<..: 15 15 15 15 15 15 15 15 15 15 ...
## $ Diet : Factor w/ 4 levels "1","2","3","4": 1 1 1 1 1 1 1 1 1 1 ...
## - attr(*, "formula")=Class 'formula' language weight ~ Time | Chick
## .. ..- attr(*, ".Environment")=<environment: R_EmptyEnv>
## - attr(*, "outer")=Class 'formula' language ~Diet
## .. ..- attr(*, ".Environment")=<environment: R_EmptyEnv>
## - attr(*, "labels")=List of 2
## ..$ x: chr "Time"
## ..$ y: chr "Body weight"
## - attr(*, "units")=List of 2
## ..$ x: chr "(days)"
## ..$ y: chr "(gm)"
## weight Time Chick Diet
## Min. : 35.0 Min. : 0.00 13 : 12 1:220
## 1st Qu.: 63.0 1st Qu.: 4.00 9 : 12 2:120
## Median :103.0 Median :10.00 20 : 12 3:120
## Mean :121.8 Mean :10.72 10 : 12 4:118
## 3rd Qu.:163.8 3rd Qu.:16.00 17 : 12
## Max. :373.0 Max. :21.00 19 : 12
## (Other):506
##
## 1 2 3 4
## 220 120 120 118
D’autres fonctions sont utiles telles que min range unique
…
Si l’on désire créer une data Frame à partir de données, on peut soit le faire manuellement, soit depuis la lecture d’un fichier (txt,csv,xls…)
planetes <- c("Mercure", "Venus", "Terre", "Mars", "Jupiter", "Saturne", "Uranus", "Neptune");
type <- c("Tellurique", "Tellurique", "Tellurique", "Tellurique", "Gazeuse", "Gazeuse", "Gazeuse", "Gazeuse")
diametre <- c(0.382, 0.949, 1, 0.532, 11.209, 9.449, 4.007, 3.883);
rotation <- c(58.64, -243.02, 1, 1.03, 0.41, 0.43, -0.72, 0.67);
anneaux <- c(FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE);
planetes_df <-data.frame(planetes,type,diametre,rotation,anneaux)
str(planetes_df)
## 'data.frame': 8 obs. of 5 variables:
## $ planetes: Factor w/ 8 levels "Jupiter","Mars",..: 3 8 6 2 1 5 7 4
## $ type : Factor w/ 2 levels "Gazeuse","Tellurique": 2 2 2 2 1 1 1 1
## $ diametre: num 0.382 0.949 1 0.532 11.209 ...
## $ rotation: num 58.64 -243.02 1 1.03 0.41 ...
## $ anneaux : logi FALSE FALSE FALSE FALSE TRUE TRUE ...
Depuis un fichier les arguments utiles sont header sep dec fill
## 'data.frame': 8 obs. of 5 variables:
## $ planetes: Factor w/ 8 levels "Jupiter","Mars",..: 3 8 6 2 1 5 7 4
## $ type : Factor w/ 2 levels "Gazeuse","Tellurique": 2 2 2 2 1 1 1 1
## $ diametre: num 0.382 0.949 1 0.532 11.209 ...
## $ rotation: num 58.64 -243.02 1 1.03 0.41 ...
## $ anneaux : logi FALSE FALSE FALSE FALSE FALSE TRUE ...
Comme pour les vecteurs ou les matrices, on peut sélectionner des éléments du jeu de données à l’aide de []
et d’une ,
Mais surtout on peut utiliser le nom d’une des variables directement dans les []
Le symbole $
permet d’accèder directement à une colonne (faisant référance à la syntaxe de pandas .
)
Le plus intéressant étant la possibilité d’utilisé des conditions pour la sélection.
La commande subset()
permet de sélectionner des observations remplissant une ou plusieurs conditions.
proches_planetes_df <- planetes_df[1:3, ]
lointaines_planetes_df <- planetes_df[6:8, ]
proches_planetes_df
## planetes type diametre rotation anneaux
## 1 Mercure Tellurique 0.382 58.64 FALSE
## 2 Venus Tellurique 0.949 -243.02 FALSE
## 3 Terre Tellurique 1.000 1.00 FALSE
## planetes type diametre rotation anneaux
## 6 Saturne Gazeuse 9.449 0.43 TRUE
## 7 Uranus Gazeuse 4.007 -0.72 TRUE
## 8 Neptune Gazeuse 3.883 0.67 TRUE
lointaines_planetes_diametre <- planetes_df[3:8,"diametre"]
planete_diametre <- planetes_df$diametre
# Ou bien planetes_df[,"diametre"] ou encore planetes_df[,3]
planete_avec_anneaux<-planetes_df[planetes_df$anneaux,]
planete_plus_grand_terre<-planetes_df[planete_diametre>1,]
subset(planetes_df,planete_diametre>1,anneaux)
## anneaux
## 5 TRUE
## 6 TRUE
## 7 TRUE
## 8 TRUE
## planetes type diametre rotation anneaux
## 5 Jupiter Gazeuse 11.209 0.41 TRUE
## 6 Saturne Gazeuse 9.449 0.43 TRUE
## 7 Uranus Gazeuse 4.007 -0.72 TRUE
## 8 Neptune Gazeuse 3.883 0.67 TRUE
Données multiples sur la même figure. En R chaque appel à la fonction plot
crée une nouvelle fenêtre de figure. La méchanique est la suivante, on crée une fenêtre et on y ajoute chaque éléments individuellements avec la fonction points
Warning: points
ajoute des points mais ne change pas le cadre de la fenêtre (limites en X & Y)
## nprocs shmem xml native
## 1 2 0.970 1.062 1.303
## 2 4 0.985 1.184 1.468
## 3 8 0.999 1.332 1.842
## 4 16 1.061 1.730 2.829
## 5 32 1.233 2.522 4.920
## 6 64 1.679 4.164 9.692
name<-names(data)
number_variable<-ncol(data)
plot(data$nprocs,data$shmem,log="xy",ylim = c(min(data[,2:number_variable]),
max(data[,2:number_variable])),xlab = name[1],ylab= "NA",main="TADaaM Plot")
points(data$nprocs,data$xml,col=2,pch=3)
points(data$nprocs,data$native,col=4,pch=5)
legend(min(data$nprocs),max(data[,2:number_variable]),
name[2:number_variable],col=c(1,2,4),pch=c(1,3,5))
text(4,5,sprintf("Correlation is %.3f",cor(data$nprocs,data$shmem)))
On peut utiliser aussi la fonction title
pour ajouter les noms des axes et le titre du graphique,le tout avec des couleurs!
plot(data$nprocs,data$shmem,log="xy",ylim = c(min(data[,2:number_variable]),max(data[,2:number_variable])),
xlab = name[1],ylab= "NA",main="TADaaM Plot")
points(data$nprocs,data$xml,col=2,pch=3)
points(data$nprocs,data$native,col=4,pch=5)
legend(min(data$nprocs),max(data[,2:number_variable]),name[2:number_variable],
col=c(1,2,4),pch=c(1,3,5))
title(main="TADaaM Plot",col.main="red",xlab=name[1],ylab="NA",col.lab="darkblue")
Le même résultat avec ggplot. Un “Plot” via cette librairie se décompose de la manière suivante MonPlot <- data + Aesthetics + Geometry Derrière le terme Aesthetics se cache tout ce qui concerne les couelurs,les tailles, les formes, les labels etc … Elle est définie via l’option aes(x=Time)
ou aes_string(x=mystr)
En ce qui concerne “Geometry”, cela regroupe les options relatives aux types de graphiques (plot,histogramme etc…)
library("reshape2")
library("ggplot2")
sp<-ggplot(data,aes_string(x=name[1]))+
geom_point(aes_string(y=name[2]),color="black")+
geom_point(aes_string(y=name[3]),color="blue")+
geom_point(aes_string(y=name[4]),color="red")+
ylab("NA")+
xlab(name[1])+
geom_text(x=15,y=7,label=sprintf("Correlation is %.3f",
cor(data$nprocs,data$shmem)),size=3)+
ggtitle("TADaaM Plot with ggplot")
sp
De façon un peu plus jolie, en utilisant la fonction melt pour fusionner les données En effet la libraire ggplot est “conçue” pour fonctionner avec des tables (ou dataframe)
## nprocs variable value
## 1 2 shmem 0,970
## 2 4 shmem 0,985
## 3 8 shmem 0,999
## 4 16 shmem 1,061
## 5 32 shmem 1,233
## 6 64 shmem 1,679
spm<-ggplot(melteddata,aes(x=nprocs,y=value,colour=variable))+
geom_point()+
ylab("NA")+
xlab(name[1])+
ggtitle("TADaaM Plot with ggplot")
spm
On peut aussi aisément relier les points
Les problèmes récurrents avec les boxplots sont centrés autour des noms des variables et de leurs emplacements . Ceci peut être contournés avec les options names las at
.
boxplot(data[,2:number_variable],col=c("blue","green","pink"),main="Boxplot Example",
names=c("First too long name", "Second too long name","Thrid too long name"))
L’option las
permet d’orienter les lables (horizontalement ou verticalement), mais cela peut nécissité d’augmenter la taille de la fenêtre avec l’option par
. On peut choisir par exemple de modifier les marges de la façon suivante : Mar(bottom = NULL, left = NULL, top = NULL, right = NULL, outer = FALSE)
boxplot(data[,2:number_variable],col=c("blue","green","pink"),main="Boxplot Example",
names=c("First too long name", "Second too long name","Thrid too long name"),
las=2,par(mar=c(12,6,4,2)+0.1))
L’option at
est généralement utilisée pour grouper des éléments ensembles
boxplot(data[,2:number_variable],col=c("blue","green","pink"),main="Boxplot Example",
names=c("First too long name", "Second too long name","Thrid too long name"),
las=2,par(mar=c(12,6,4,2)+0.1),
at= c(1,5,6))
boxplt<-ggplot(melteddata,aes(x=variable,y=value,fill=variable))+geom_boxplot()+
labs(title="Boxplot By GGplot",x="Variable", y = "Value")
boxplt
boxplt+scale_x_discrete(limits=c("xml","native","shmem"))+
theme(axis.text.x = element_text(angle = 30,hjust=1))
Le plotyy (matlab,python…) représente un plot avec deux échelles différentes Utilisation des données météo du MdB Kibana
library(jsonlite)
library(pracma)
library(ggplot2)
data<-fromJSON(txt="meteo.json")
columns_names<-names(data)
pluie<-integer()
vent<-integer()
date_char<-character()
for (name_idx in 1:length(data)){
if (startsWith(columns_names[name_idx],"2019")){
pluie<-append(pluie,data[[columns_names[name_idx]]]$pluie)
vent<-append(vent,data[[columns_names[name_idx]]]$vent_moyen$`10m`)
date_char<-append(date_char,columns_names[name_idx])
}
}
date_time<-as.POSIXct(strptime(date_char,format="%Y-%m-%d %H:%M:%S"))
Méthode non conventionnelle