Commit 33cf632e authored by viryl's avatar viryl
Browse files

MAJ ManipDon

parent caec4e3d
Pipeline #15639 passed with stages
in 1 minute and 10 seconds
......@@ -27,7 +27,7 @@ Ce cours est associé au projet [ATMO_IntroR](https://gricad-gitlab.univ-grenobl
## Le serveur de notebooks de l'UMS GRICAD
- Connectez vous sur [le serveur de notebook de GRICAD](https://jupyterhub.u-ga.fr/) avec votre compte Agalan.
- Connectez vous sur [le erveur de notebook de GRICAD](https://jupyterhub.u-ga.fr/) avec votre compte Agalan.
- Exécutez le notebook **Intro_config.ipynb** dans le répertoire **~/ATMO_IntroR/notebook** du serveur. C'est la page d'accueil, à la connexion sur le serveur.
......
......@@ -19,7 +19,7 @@ pages:
- Concentration NO2 : mesureNO2_2016_Correct.md
- Manipulation objets : ObjetManip.md
- Traitement des dates : TraitementDate.md
theme : yeti
......
......@@ -4334,13 +4334,532 @@
"Pour en savoir plus consulter : https://juba.github.io/tidyverse/10-dplyr.html#preparation-2"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Manipulation de chaînes de caractères\n",
"\n",
"La manipulation de chaînes de caractères intervient fréquement dans une étude particulièrement dans le nettoyage ou la préparation des données. \n",
"\n",
"Le package de base R fournit quelques fonctions:\n",
"- **paste**: concaténation de chaînes, \n",
"- **nbchar**: nombre de caractère\n",
"- **substr**: extraction/remplacement de cahine dans un vecteur de caractères.\n",
"- ...\n",
"\n",
"Le package **stringr** fournit une interface propre et performante pour le traitement de ces chaînes de caractères ([stringr: modern,consistent string processing](https://journal.r-project.org/archive/2010-2/RJournal_2010-2_Wickham.pdf).\n",
"\n",
"Nous présentons quelques fonctions du package **stringr**, pour en savoir plus consulter le help et la documentation du package.\n",
"\n",
"Les fonctions présentées sont pour la plupart prévues pour fonctionner avec [**des expressions régulières**](https://thinkr.fr/r-les-expressions-regulieres/)(ou http://perso.ens-lyon.fr/lise.vaudor/strings-et-expressions-regulieres/). Par soucis de simplicité, les exemples seront donnés autant que possible avec de simples chaînes, sans expression régulière. Mais pour manipuler des données textuelles, il peut être très utile de s’intéresser à la syntaxe des expressions régulières.\n",
"\n",
"Les exemples fournis sont issus de [Rblogs / lang](https://www.r-bloggers.com/lang/about).\n",
"\n",
"### Concaténer des chaînes de caratères\n",
"\n",
"* La fonction **paste** du package de base R"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Les donnees utilisees\n",
"d <- list(\n",
" nom = c(\"Mr Félicien Machin\", \"Mme Raymonde Bidule\", \"M. Martial Truc\", \"Mme Huguette Chose\"),\n",
" adresse = c(\"3 rue des Fleurs\", \"47 ave de la Libération\", \"12 rue du 17 octobre 1961\", \"221 avenue de la Libération\"),\n",
" ville = c(\"Nouméa\", \"Marseille\", \"Vénissieux\", \"Marseille\") \n",
")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Avec la fonction paste, on concatène l'adresses et la ville en ajoutant un blanc.\n",
"\n",
"* On pourra également utiliser la fonction **str$\\_$c** du package **stringr**, on ajoute une chaîne vide."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"paste(d$adresse,d$ville) # On concatène l'adresse et la ville en ajoutant un blanc par défaut\n",
"# avec le package stringr\n",
"library(stringr)\n",
"str_c(d$adresse,d$ville) # "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"* On concatène l'adresse et la ville en ajoutant un séparateur avec l'argument **sep=\"\"**"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"str_c(d$adresse,d$ville,sep=\" \") # équivalent de la fonction paste par défaut\n",
"#\n",
"paste(d$adresse,d$ville,sep=\" - \") # On concatène l'adresse et la ville en ajoutant un \" - \" entre"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Longueur d'une chaîne : \n",
"* la fonction **str_length**: équivalent de la fonction **nchar**"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"nchar(\"abc\")\n",
"nchar(NA)\n",
"nchar(factor(\"abc\"))"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"str_length(\"abc\")\n",
"str_length(NA)\n",
"str_length(factor(\"abc\"))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Extraction/ Remplacement d'une sous-chaîne \n",
"* La fonction **str_substr**: équivalent de **substr**"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Extraction \n",
"str_sub(\"abcdef\", 1, 3) # extraction des éléments 1 à 3\n",
"str_sub(\"abcdef\", 4) # extraction à partir du 4 iéme élélent\n",
"str_sub(\"abcdef\", -2) # Extraction des deux derniers éléments"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Remplacement\n",
"x <- \"abcdef\"\n",
"str_sub(x, 1, 3) <- \"aaa\"\n",
"x"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Suppression des espaces en début et fin \n",
"* la fonction **str_trim**"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"str_trim(\" abc \") # suprimme en début et en fin\n",
"str_trim(\" abc \",side=\"left\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Détecter la présence d'un motif : \n",
"\n",
"**str_detect**: renvoie un vecteur logique indiquant si le motif a été repéré pour chaque élément d'un vecteur : "
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<ol class=list-inline>\n",
"\t<li>TRUE</li>\n",
"\t<li>FALSE</li>\n",
"\t<li>TRUE</li>\n",
"</ol>\n"
],
"text/latex": [
"\\begin{enumerate*}\n",
"\\item TRUE\n",
"\\item FALSE\n",
"\\item TRUE\n",
"\\end{enumerate*}\n"
],
"text/markdown": [
"1. TRUE\n",
"2. FALSE\n",
"3. TRUE\n",
"\n",
"\n"
],
"text/plain": [
"[1] TRUE FALSE TRUE"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"ch <- c(\"M. patate\", \"brocolis patissiers\", \"patates patissieres\")\n",
"str_detect(ch, \"patate\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Localiser un motif \n",
"**str_locate**: renvoie les positions de la première occurrence d'un *motif* dans chaque élément d'un vecteur<br>\n",
"**str_locate_all**: renvoie les positions de toutes les occurrences du *motif* "
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<table>\n",
"<thead><tr><th scope=col>start</th><th scope=col>end</th></tr></thead>\n",
"<tbody>\n",
"\t<tr><td>NA</td><td>NA</td></tr>\n",
"\t<tr><td>10</td><td>18</td></tr>\n",
"\t<tr><td> 9</td><td>17</td></tr>\n",
"</tbody>\n",
"</table>\n"
],
"text/latex": [
"\\begin{tabular}{ll}\n",
" start & end\\\\\n",
"\\hline\n",
"\t NA & NA\\\\\n",
"\t 10 & 18\\\\\n",
"\t 9 & 17\\\\\n",
"\\end{tabular}\n"
],
"text/markdown": [
"\n",
"start | end | \n",
"|---|---|---|\n",
"| NA | NA | \n",
"| 10 | 18 | \n",
"| 9 | 17 | \n",
"\n",
"\n"
],
"text/plain": [
" start end\n",
"[1,] NA NA \n",
"[2,] 10 18 \n",
"[3,] 9 17 "
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"str_locate(ch, \"patiss.*r\")"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<ol>\n",
"\t<li><table>\n",
"<thead><tr><th scope=col>start</th><th scope=col>end</th></tr></thead>\n",
"<tbody>\n",
"\t<tr><td>4</td><td>6</td></tr>\n",
"</tbody>\n",
"</table>\n",
"</li>\n",
"\t<li><table>\n",
"<thead><tr><th scope=col>start</th><th scope=col>end</th></tr></thead>\n",
"<tbody>\n",
"\t<tr><td>10</td><td>12</td></tr>\n",
"</tbody>\n",
"</table>\n",
"</li>\n",
"\t<li><table>\n",
"<thead><tr><th scope=col>start</th><th scope=col>end</th></tr></thead>\n",
"<tbody>\n",
"\t<tr><td>1 </td><td> 3</td></tr>\n",
"\t<tr><td>9 </td><td>11</td></tr>\n",
"</tbody>\n",
"</table>\n",
"</li>\n",
"</ol>\n"
],
"text/latex": [
"\\begin{enumerate}\n",
"\\item \\begin{tabular}{ll}\n",
" start & end\\\\\n",
"\\hline\n",
"\t 4 & 6\\\\\n",
"\\end{tabular}\n",
"\n",
"\\item \\begin{tabular}{ll}\n",
" start & end\\\\\n",
"\\hline\n",
"\t 10 & 12\\\\\n",
"\\end{tabular}\n",
"\n",
"\\item \\begin{tabular}{ll}\n",
" start & end\\\\\n",
"\\hline\n",
"\t 1 & 3\\\\\n",
"\t 9 & 11\\\\\n",
"\\end{tabular}\n",
"\n",
"\\end{enumerate}\n"
],
"text/markdown": [
"1. \n",
"start | end | \n",
"|---|\n",
"| 4 | 6 | \n",
"\n",
"\n",
"\n",
"2. \n",
"start | end | \n",
"|---|\n",
"| 10 | 12 | \n",
"\n",
"\n",
"\n",
"3. \n",
"start | end | \n",
"|---|---|\n",
"| 1 | 3 | \n",
"| 9 | 11 | \n",
"\n",
"\n",
"\n",
"\n",
"\n"
],
"text/plain": [
"[[1]]\n",
" start end\n",
"[1,] 4 6\n",
"\n",
"[[2]]\n",
" start end\n",
"[1,] 10 12\n",
"\n",
"[[3]]\n",
" start end\n",
"[1,] 1 3\n",
"[2,] 9 11\n"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"str_locate_all(ch, \"pat\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Extraire des sous-chaînes\n",
"\n",
"* **str_extract** fonctionne de la même manière que *str_locate* mais renvoit le texte correspondant au *motif* plutôt que la position : "
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<ol class=list-inline>\n",
"\t<li>'patate'</li>\n",
"\t<li>'patissiers'</li>\n",
"\t<li>'patates patissieres'</li>\n",
"</ol>\n"
],
"text/latex": [
"\\begin{enumerate*}\n",
"\\item 'patate'\n",
"\\item 'patissiers'\n",
"\\item 'patates patissieres'\n",
"\\end{enumerate*}\n"
],
"text/markdown": [
"1. 'patate'\n",
"2. 'patissiers'\n",
"3. 'patates patissieres'\n",
"\n",
"\n"
],
"text/plain": [
"[1] \"patate\" \"patissiers\" \"patates patissieres\""
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<ol class=list-inline>\n",
"\t<li>'science'</li>\n",
"\t<li>NA</li>\n",
"\t<li>'science'</li>\n",
"</ol>\n"
],
"text/latex": [
"\\begin{enumerate*}\n",
"\\item 'science'\n",
"\\item NA\n",
"\\item 'science'\n",
"\\end{enumerate*}\n"
],
"text/markdown": [
"1. 'science'\n",
"2. NA\n",
"3. 'science'\n",
"\n",
"\n"
],
"text/plain": [
"[1] \"science\" NA \"science\""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"str_extract(ch, \"pat.*\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"str_extract_all(ch, \"pat.\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"* **str_match** fonctionne comme **str_extract** mais permet de différencier les groupements. La fonction renvoit une matrice dont la première colonne est l'extraction du motif dans son ensemble, et les colonnes suivantes l'extraction de chaque groupe : "
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"ch\n",
"str_match(ch, \"(.*) (patissier.*)$\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Remplacement de motif\n",
"\n",
"**str_replace** est équivalent aux fonctions **sub** et **gsub** "
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"str_replace_all(ch, \"patate(.?)\\\\b\", \"pomme\\\\1 de terre\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Découper selon un motif\n",
"\n",
"**str_split** découpe une chaîne en un nombre variable de sous-chaînes selon un motif de séparation. "
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"ch <- \"un et deux et trois et quatre\"\n",
"str_split(ch, \" et \")"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": true
},
"source": [
"### Pour en savoir plus:\n",
"## Documentation\n",
"\n",
"### Gestion de données dans R\n",
"\n",
"* [Introduction à R et au tidyverse](https://juba.github.io/tidyverse/index.html)\n",
"\n",
......@@ -4348,8 +4867,25 @@
"\n",
"* [Begin'R (Bordeaux INP](http://beginr.u-bordeaux.fr/index.html#sommaire))\n",
"\n",
"* [Cookbook for R](http://www.cookbook-r.com/Manipulating_data/)\n"
"* [Cookbook for R](http://www.cookbook-r.com/Manipulating_data/)\n",
"\n",
"### Manipulation de chaînes de caractères\n",
"* Article dans R Journal de *Hadley Wickham* [stringr: modern, consistent string\n",
"processing](https://journal.r-project.org/archive/2010-2/RJournal_2010-2_Wickham.pdf) <br>\n",
"\n",
"\n",
"* [Documentation du package *stringr*](https://cran.r-project.org/web/packages/stringr/index.html) sur le CRAN ou dans son implémentation.\n",
"\n",
"\n",
"* [Introduction à R et au tidyverse](https://juba.github.io/tidyverse/11-stringr.html) de Julien Barnier"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
......
<
%% Cell type:markdown id: tags:
# Manipuler des données dans R
En statistique, les données constituent le point de départ de toute analyse, un premier travail de mise en forme de ces données est presque toujours indispensable. Il faudra savoir maitriser des opérations comme:
* Importation de données sous différents formats,
* exporter des données et des résultats sous différents formats,
* concaténer ou extraire des données,
* repérer les individus ayant des données manquantes ou aberrantes.
* changer le type de certaines variables pour les adapter aux traitements envisagés,
* $\ldots$
On abordera le concept de **tidy data**, les extensions du **tidyverse** comme **dplyr** ou **ggplot2** partent du principe que les données sont “bien rangées” sous forme de tidy data.
R fournit des outils et des capacités de programmation pour effectuer ces différentes tâches.
## Importer des données
Les données sont initialement collectées, stockées sous différents formats, éventuellement prétraitées par un logiciel ou extraites d'une base de données.
Chaque logiciel ayant son propre format de stockage, le plus simple est souvent d'échanger les données par un format commun à tous qui sera le plus souvent **le format texte** ( .csv par exemple).
On peut également utiliser **les formats propriétaires** (SAS,SPSS,...) des autres logiciels en utilisant un package adapté (le package **foreign** par exemple), le choix dépendant du contexte et du volume des données.
## Importer des données en format texte
### Cas des fichiers **csv**
Les avantages des fichiers **csv**:
- Peut être lu par n'importe quel logiciel passé, présent et probablement futur.
- Pour la compatibilité entre plate-forme (Windows, Mac, Linux).
- Pour la facilité de lecture par un être humain comparativement à d'autres formats tels que XML, HL7, JSON etc.
**Mais** pas forcément adapté aux gros volumes de données pour son volume de stockage et la rapidité de lecture.
R lit des données en format texte avec les fonctions **read.table()**,**read.csv()**,**scan()**,**read.fwf()**,$\ldots$
* Le fichier "donnees.csv" est stocké dans le répertoire data sitée dans le répertoire de travail
- pour connaître le répertoire de travail, utiliser la fonction **getwd()**
- pour définir le répertoire de travail, la fonction **setwd()**
Le résultat de la fonction **read.table** ou **read.csv** est de type **data-frame**.
%% Cell type:code id: tags:
``` R
# Lecture du fichier donnees.csv
getwd() # repertoire de travail
don <- read.csv(file = "data/donnees.csv",header=TRUE,sep=";",dec=",",row.names=1)
```
%%%% Output: display_data
'/Users/viryl/formation/FormationContinue/ATMO/ATMO_IntroR/notebooks'
'/Users/viryl/formation/FormationContinue/ATMO/ATMO\_IntroR/notebooks'
%% Cell type:markdown id: tags:
- l'argument **sep** : indique que les valeurs sont séparées par **";"** (**" "** pour un espace, **"\t"** pour une tabulation,$\ldots$)
- l'argument **dec** : indique que le séparateur de décimal est **","**
- l'argument **header** : indique si la première ligne contient les noms des variables (TRUE) ou non(FALSE).
- l'argument **row.names** : indique que la colonne 1 n'est pas une variable mais l'identifiant des individus.
%% Cell type:code id: tags:
``` R
# "mode" et "class"
mode(don)
class(don)
```
%%%% Output: display_data
'list'
'list'
%%%% Output: display_data
'data.frame'
'data.frame'
%% Cell type:code id: tags:
``` R
# Statistiques des variables du data.frame
summary(don)
```
%%%% Output: display_data
%% Cell type:markdown id: tags:
#### Fonctions utilisees sur un data-frame
%% Cell type:code id: tags:
``` R
# Attributs d'un data-frame
attributes(don)
```
%%%% Output: display_data
$names
: 1. 'taille'
2. 'poids'
3. 'pointure'
4. 'sexe'
$class
: 'data.frame'
$row.names
: 1. 'roger'
2. 'theodule'
3. 'nicolas'
\begin{description}
\item[\$names] \begin{enumerate*}
\item 'taille'
\item 'poids'
\item 'pointure'
\item 'sexe'
\end{enumerate*}
\item[\$class] 'data.frame'
\item[\$row.names] \begin{enumerate*}
\item 'roger'
\item 'theodule'
\item 'nicolas'
\end{enumerate*}
\end{description}
%% Cell type:code id: tags:
``` R
# Afficher de manière compacte la structure d'un objet R
str(don)
```
%%%% Output: stream
'data.frame': 3 obs. of 4 variables:
$ taille : num 184 176 158
$ poids : int 80 5 72
$ pointure: int 44 43 42
$ sexe : Factor w/ 1 level "M": 1 1 1
%% Cell type:code id: tags:
``` R
# Nom des variables
names(don)
```
%%%% Output: display_data
1. 'taille'
2. 'poids'
3. 'pointure'
4. 'sexe'
\begin{enumerate*}
\item 'taille'
\item 'poids'
\item 'pointure'
\item 'sexe'
\end{enumerate*}
%% Cell type:code id: tags:
``` R
# Nombre de lignes(individus) et de colonnes(variables)
nrow(don)
ncol(don)
```
%%%% Output: display_data
3
3
%%%% Output: display_data
4
4
%% Cell type:code id: tags:
``` R
# Nom des lignes(1.) et des colonnes(2.)
dimnames(don)
```
%%%% Output: display_data
1. 1. 'roger'
2. 'theodule'
3. 'nicolas'
2. 1. 'taille'
2. 'poids'
3. 'pointure'
4. 'sexe'
\begin{enumerate}
\item \begin{enumerate*}
\item 'roger'
\item 'theodule'
\item 'nicolas'
\end{enumerate*}
\item \begin{enumerate*}
\item 'taille'
\item 'poids'
\item 'pointure'
\item 'sexe'
\end{enumerate*}
\end{enumerate}
%% Cell type:markdown id: tags:
#### Un caractère spécial peut indiquer qu'il y a des données manquantes:
Le fichier **don2.csv** contient des données manquantes codées **"\*\*\*"**, on ajoute l'argument **na.strings**
%% Cell type:code id: tags:
``` R
don2 <- read.csv(file = "data/don2.csv",header=TRUE,sep=";",dec=",",row.names=1,na.strings="***")
summary(don2)
mean(don2$poids)
mean(don2$poids,na.rm=TRUE)
```
%%%% Output: display_data
%%%% Output: display_data
&lt;NA&gt;
<NA>
%%%% Output: display_data
55
55
%% Cell type:markdown id: tags:
#### Le chemin peut-être une URL:
%% Cell type:code id: tags:
``` R
df <- read.table("https://s3.amazonaws.com/assets.datacamp.com/blog_assets/scores_timed.csv",header=TRUE,row.names = 1,sep = ",")
summary(df)
```
%%%% Output: stream
Warning message in file(file, "rt"):
“URL 'https://s3.amazonaws.com/assets.datacamp.com/blog_assets/scores_timed.csv': status was 'SSL connect error'”
%%%% Output: error
Error in file(file, "rt"): cannot open the connection to 'https://s3.amazonaws.com/assets.datacamp.com/blog_assets/scores_timed.csv'
Traceback:
1. read.table("https://s3.amazonaws.com/assets.datacamp.com/blog_assets/scores_timed.csv",
. header = TRUE, row.names = 1, sep = ",")