{"id":783,"date":"2017-07-13T09:59:06","date_gmt":"2017-07-13T07:59:06","guid":{"rendered":"http:\/\/perso.ens-lyon.fr\/lise.vaudor\/?p=783"},"modified":"2017-07-13T10:12:17","modified_gmt":"2017-07-13T08:12:17","slug":"manipuler-des-strings-avec-r","status":"publish","type":"post","link":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/manipuler-des-strings-avec-r\/","title":{"rendered":"Manipuler des strings avec R"},"content":{"rendered":"<p><img decoding=\"async\" src=\"..\/..\/lise.vaudor\/Rfigures\/Manip_de_strings\/Lise_Vaudor_headband-1.png\" alt=\"\" \/><\/p>\n<p>Oui, bon, j&rsquo;avoue, j&rsquo;ai choisi le titre de ce billet expr\u00e8s pour que, \u00e0 sa lecture, vous ayiez ce genre d&rsquo;image qui vous vienne \u00e0 l&rsquo;esprit:<\/p>\n<p><img decoding=\"async\" src=\"..\/..\/lise.vaudor\/Rfigures\/Manip_de_strings\/string1.png\" alt=\"\" \/><\/p>\n<p>Mais en vrai, je m&rsquo;appr\u00eate \u00e0 vous parler de quelque chose d&rsquo;un peu moins \u00ab\u00a0caliente\u00a0\u00bb, car<\/p>\n<p><img decoding=\"async\" src=\"..\/..\/lise.vaudor\/Rfigures\/Manip_de_strings\/string2.png\" alt=\"\" \/><\/p>\n<p>En revanche:<\/p>\n<p><img decoding=\"async\" src=\"..\/..\/lise.vaudor\/Rfigures\/Manip_de_strings\/string3.png\" alt=\"\" \/><\/p>\n<p>Vous l&rsquo;aurez compris, je parle ici de \u00ab\u00a0manipuler des strings\u00a0\u00bb pour \u00ab\u00a0manipuler des cha\u00eenes de caract\u00e8res\u00a0\u00bb, en fran\u00e7ais (je vais tout-de-m\u00eame rester sur \u00ab\u00a0string\u00a0\u00bb pour la suite de l&rsquo;article parce que, en plus d&rsquo;\u00eatre plus dr\u00f4le, c&rsquo;est plus court!).<\/p>\n<h1>Pourquoi vouloir manipuler des strings<\/h1>\n<p>Deux raisons principales possibles:<\/p>\n<ul>\n<li>parce que vous <strong>travaillez sur des textes<\/strong> (romans, articles de presse, articles scientifiques, sites web, tweets, et j&rsquo;en passe), et que vous voulez faire du <strong>text mining<\/strong> sur ces donn\u00e9es<\/li>\n<li>parce que vous avez besoin de <strong>nettoyer\/r\u00e9cup\u00e9rer<\/strong> des infos \u00ab\u00a0emprisonn\u00e9es\u00a0\u00bb dans des cha\u00eenes de caract\u00e8re&#8230; Par exemple, vous avez un capteur qui vous cr\u00e9e des fichiers dont le nom est \u00ab\u00a0monsuperfichier_02032017_X330441.22_Y402933.54.txt\u00a0\u00bb et vous voulez r\u00e9cup\u00e9rer la date (02\/03\/2017) et les coordonn\u00e9es (X et Y) correspondant \u00e0 chacun de ces fichiers. Ou vous avez une colonne de tableau contenant des informations du style \u00ab\u00a0Bruce Wayne, Batman, justicier masqu\u00e9\u00a0\u00bb et vous voulez faire en sorte que ces informations soient s\u00e9par\u00e9s en \u00ab\u00a0Bruce Wayne\u00a0\u00bb, \u00ab\u00a0Batman\u00a0\u00bb, et \u00ab\u00a0justicier masqu\u00e9\u00a0\u00bb&#8230;<\/li>\n<\/ul>\n<p>Dans les deux cas, savoir r\u00e9aliser des op\u00e9rations basiques (d\u00e9tection de patterns, remplacement de patterns, d\u00e9coupe des strings) va se r\u00e9veler indispensable&#8230; Et pour ce faire, l&rsquo;usage du package <code>stringr<\/code>, notamment, est d&rsquo;une aide pr\u00e9cieuse&#8230; Les fonctions de ce package sont facilement reconnaissables puisque tous leurs noms commencent par \u00ab\u00a0str_\u00a0\u00bb&#8230;<\/p>\n<p>Voici un petite \u00ab\u00a0aide-m\u00e9moire\u00a0\u00bb montrant l&rsquo;utilit\u00e9 de celles que je vais aborder dans ce billet. Je vais bien s\u00fbr vous montrer des exemples en lignes de commande plut\u00f4t qu&rsquo;en dessins bigarr\u00e9s, mais je trouve les dessins utiles pour s&rsquo;y retrouver (je dois avoir une m\u00e9moire visuelle!):<\/p>\n<p><img decoding=\"async\" src=\"..\/..\/lise.vaudor\/Rfigures\/Manip_de_strings\/stringr.png\" alt=\"\" \/><\/p>\n<p>Dans le d\u00e9tail, maintenant:<\/p>\n<h1>str_c() combine des strings<\/h1>\n<p><img decoding=\"async\" src=\"..\/..\/lise.vaudor\/Rfigures\/Manip_de_strings\/str_c.png\" alt=\"\" \/><\/p>\n<pre><code>library(stringr)\nstr_c(\"abra\",\"ca\",\"dabra\")\n\n## [1] \"abracadabra\"\n\nstr_c(\"Les jeux\",\"de mots laids\",\"sont pour\",\"les gens b\u00eates\", sep=\" \")\n\n## [1] \"Les jeux de mots laids sont pour les gens b\u00eates\"\n<\/code><\/pre>\n<h1>str_length() compte le nombre de caract\u00e8res dans un string<\/h1>\n<p><img decoding=\"async\" src=\"..\/..\/lise.vaudor\/Rfigures\/Manip_de_strings\/str_length.png\" alt=\"\" \/><\/p>\n<pre><code>str_length(\"anticonstitutionnellement\")\n\n## [1] 25\n<\/code><\/pre>\n<h1>str_sub() extrait les caract\u00e8res de la cha\u00eene, de l&#8217;emplacement start \u00e0 l&#8217;emplacement end<\/h1>\n<p><img decoding=\"async\" src=\"..\/..\/lise.vaudor\/Rfigures\/Manip_de_strings\/str_sub.png\" alt=\"\" \/><\/p>\n<pre><code>str_sub(\"youpiyaya\",start=1,end=5)\n\n## [1] \"youpi\"\n\nstr_sub(\"youpiyaya\",start=-4)\n\n## [1] \"yaya\"\n\nstr_sub(\"youpiyaya\",start=4)\n\n## [1] \"piyaya\"\n<\/code><\/pre>\n<h1>str_split() d\u00e9coupe les strings partout o\u00f9 un pattern (ou motif) est pr\u00e9sent<\/h1>\n<p><img decoding=\"async\" src=\"..\/..\/lise.vaudor\/Rfigures\/Manip_de_strings\/str_split.png\" alt=\"\" \/><\/p>\n<pre><code>str_split(c(\"beau_gros_chat\",\n            \"joli_chien\",\n            \"vilain_petit_canard\"),\n          \"_\")\n\n## [[1]]\n## [1] \"beau\" \"gros\" \"chat\"\n## \n## [[2]]\n## [1] \"joli\"  \"chien\"\n## \n## [[3]]\n## [1] \"vilain\" \"petit\"  \"canard\"\n<\/code><\/pre>\n<p>Le pattern (ici \u00ab\u00a0_\u00a0\u00bb) peut \u00eatre pr\u00e9sent un nombre variable de fois, donc les \u00e9l\u00e9ments en sortie ne sont pas forc\u00e9ment de la m\u00eame taille. C&rsquo;est pourquoi cette fonction renvoie une liste.<\/p>\n<p>En revanche, si l&rsquo;on sait que tous les \u00e9l\u00e9ments de l&rsquo;input seront d\u00e9coup\u00e9s en autant de morceaux, alors on peut demander une sortie sous forme de matrice, plus pratique \u00e0 manipuler par la suite, \u00e0 l&rsquo;aide de l&rsquo;argument <code>simplify=TRUE<\/code>.<\/p>\n<pre><code>str_split(c(\"beau_gros_chat\",\n            \"joli_petit_chien\",\n            \"vilain_petit_canard\"),\n          \"_\",\n          simplify=TRUE)\n\n##      [,1]     [,2]    [,3]    \n## [1,] \"beau\"   \"gros\"  \"chat\"  \n## [2,] \"joli\"   \"petit\" \"chien\" \n## [3,] \"vilain\" \"petit\" \"canard\"\n<\/code><\/pre>\n<h1>str_detect() d\u00e9tecte un pattern<\/h1>\n<p><img decoding=\"async\" src=\"..\/..\/lise.vaudor\/Rfigures\/Manip_de_strings\/str_detect.png\" alt=\"\" \/><\/p>\n<pre><code>str_detect(c(\"Quarante\",\"carottes\",\"crues\",\n             \"croient\",\"que\",\"croquer\",\n             \"cr\u00e9e\",\"des\",\"crampes.\"),\n           pattern=\"cr\")\n\n## [1] FALSE FALSE  TRUE  TRUE FALSE  TRUE  TRUE FALSE  TRUE\n<\/code><\/pre>\n<h1>str_count() compte les occurrences d&rsquo;un pattern<\/h1>\n<p><img decoding=\"async\" src=\"..\/..\/lise.vaudor\/Rfigures\/Manip_de_strings\/str_count.png\" alt=\"\" \/><\/p>\n<pre><code>str_count(c(\"L'\u00e2ne\",\"Trotro\",\"trotte\",\"\u00e0 une allure\",\"traitreusement\",\"tranquille\"),\n           pattern=\"tr\")\n\n## [1] 0 1 1 0 2 1\n<\/code><\/pre>\n<h1>str_subset() cr\u00e9e un subset du vecteur o\u00f9 le pattern est pr\u00e9sent<\/h1>\n<p><img decoding=\"async\" src=\"..\/..\/lise.vaudor\/Rfigures\/Manip_de_strings\/str_subset.png\" alt=\"\" \/><\/p>\n<pre><code>str_subset(c(\"Quarante\",\"carottes\",\"crues\",\n             \"croient\",\"que\",\"croquer\",\n             \"cr\u00e9e\",\"des\",\"crampes.\"),\n           pattern=\"cr\")\n\n## [1] \"crues\"    \"croient\"  \"croquer\"  \"cr\u00e9e\"     \"crampes.\"\n<\/code><\/pre>\n<h1>str_extract() extrait le pattern (l\u00e0 o\u00f9 il est pr\u00e9sent)<\/h1>\n<p><img decoding=\"async\" src=\"..\/..\/lise.vaudor\/Rfigures\/Manip_de_strings\/str_extract.png\" alt=\"\" \/><\/p>\n<pre><code>str_extract(c(\"L'\u00e2ne\",\"Trotro\",\"trotte\",\"\u00e0 une allure\",\"traitreusement\",\"tranquille\"),\n           pattern=\"tr\")\n\n## [1] NA   \"tr\" \"tr\" NA   \"tr\" \"tr\"\n<\/code><\/pre>\n<p>Notez la diff\u00e9rence entre str_extract() et str_extract_all():<\/p>\n<pre><code>str_extract_all(c(\"L'\u00e2ne\",\"Trotro\",\"trotte\",\"\u00e0 une allure\",\"traitreusement\",\"tranquille\"),\n           pattern=\"tr\")\n\n## [[1]]\n## character(0)\n## \n## [[2]]\n## [1] \"tr\"\n## \n## [[3]]\n## [1] \"tr\"\n## \n## [[4]]\n## character(0)\n## \n## [[5]]\n## [1] \"tr\" \"tr\"\n## \n## [[6]]\n## [1] \"tr\"\n<\/code><\/pre>\n<p>Si un pattern est pr\u00e9sent plusieurs fois dans un des \u00e9l\u00e9ments du vecteur en input, alors il correspondra \u00e0 plusieurs \u00e9l\u00e9ments dans l&rsquo;output (ainsi l&rsquo;output correspond non pas \u00e0 un vecteur de m\u00eame taille que l&rsquo;input, mais \u00e0 une liste).<\/p>\n<h1>str_replace() remplace le pattern par un autre motif<\/h1>\n<p><img decoding=\"async\" src=\"..\/..\/lise.vaudor\/Rfigures\/Manip_de_strings\/str_replace.png\" alt=\"\" \/><\/p>\n<pre><code>str_replace(\"All we hear is Radio ga ga Radio goo goo Radio ga ga\",\n            pattern=\"goo\",\n            replacement=\"ga\")\n\n## [1] \"All we hear is Radio ga ga Radio ga goo Radio ga ga\"\n\nstr_replace_all(\"All we hear is Radio ga ga Radio goo goo Radio ga ga\",\n            pattern=\"goo\",\n            replacement=\"ga\")\n\n## [1] \"All we hear is Radio ga ga Radio ga ga Radio ga ga\"\n<\/code><\/pre>\n<p>L\u00e0 encore, notez la diff\u00e9rence entre str_replace() et str_replace_all()!!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Oui, bon, j&rsquo;avoue, j&rsquo;ai choisi le titre de ce billet expr\u00e8s pour que, \u00e0 sa lecture, vous ayiez ce genre d&rsquo;image qui vous vienne \u00e0 l&rsquo;esprit: Mais en vrai, je m&rsquo;appr\u00eate \u00e0 vous parler de quelque chose d&rsquo;un peu moins \u00ab\u00a0caliente\u00a0\u00bb, car En revanche: Vous l&rsquo;aurez compris, je parle ici de \u00ab\u00a0manipuler des strings\u00a0\u00bb pour \u00ab\u00a0manipuler des cha\u00eenes de caract\u00e8res\u00a0\u00bb, en fran\u00e7ais (je vais tout-de-m\u00eame rester sur \u00ab\u00a0string\u00a0\u00bb pour la.. <a href=\"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/manipuler-des-strings-avec-r\/\">Read More<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[],"class_list":["post-783","post","type-post","status-publish","format-standard","hentry","category-tous-les-posts"],"_links":{"self":[{"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/posts\/783","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/comments?post=783"}],"version-history":[{"count":8,"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/posts\/783\/revisions"}],"predecessor-version":[{"id":807,"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/posts\/783\/revisions\/807"}],"wp:attachment":[{"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/media?parent=783"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/categories?post=783"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/tags?post=783"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}