Commit 33cf632e authored by viryl's avatar viryl

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": {
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment