{"id":585,"date":"2016-10-12T11:35:39","date_gmt":"2016-10-12T09:35:39","guid":{"rendered":"http:\/\/perso.ens-lyon.fr\/lise.vaudor\/?p=585"},"modified":"2017-07-28T10:31:46","modified_gmt":"2017-07-28T08:31:46","slug":"nettoyer-et-structurer-ses-donnees","status":"publish","type":"post","link":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/nettoyer-et-structurer-ses-donnees\/","title":{"rendered":"Nettoyer et structurer ses donn\u00e9es"},"content":{"rendered":"<p><img decoding=\"async\" src=\"..\/..\/lise.vaudor\/Rfigures\/Nettoyer_ses_donnees\/Lise_Vaudor_headband-1.png\" alt=\"\" \/><\/p>\n<p>Plus je travaille avec R, plus je travaille sur les donn\u00e9es de coll\u00e8gues, et plus je r\u00e9alise l&rsquo;importance (en termes de temps, et en termes de cons\u00e9quences sur l&rsquo;analyse elle-m\u00eame) de l&rsquo;\u00e9tape pr\u00e9alable \u00e0 l&rsquo;analyse: le <strong>nettoyage<\/strong> et la <strong>mise en forme<\/strong> des donn\u00e9es.<\/p>\n<p>En effet, la fa\u00e7on dont on structure son jeu de donn\u00e9es va d&rsquo;une part conditionner notre capacit\u00e9 \u00e0 comprendre, intuitivement, quelles sont les analyses que l&rsquo;on peut r\u00e9aliser (les donn\u00e9es doivent ainsi \u00eatre organis\u00e9es correctement, en lien avec la question de recherche que l&rsquo;on se pose!). Une organisation correcte du jeu de donn\u00e9es va \u00e9galement nous permettre de r\u00e9aliser facilement les analyses en question. Sous R, les fonctions sont con\u00e7ues pour proc\u00e9der facilement \u00e0 l&rsquo;analyse (la plupart du temps, m\u00eame, en deux coups de cuill\u00e8re \u00e0 pot) pourvu qu&rsquo;on leur fournisse des arguments \u00ab\u00a0conformes\u00a0\u00bb en entr\u00e9e.<\/p>\n<p>Deux types de probl\u00e8mes peuvent se pr\u00e9senter lorsque l&rsquo;on travaille sur des jeux de donn\u00e9es \u00ab\u00a0sales\u00a0\u00bb:<\/p>\n<ul>\n<li>le premier type est li\u00e9 \u00e0 la <strong>lecture d&rsquo;un fichier<\/strong> depuis R. Dans ce cas c&rsquo;est l&rsquo;appel \u00e0 la fonction <code>read.table<\/code> (ou consoeur) qui va poser probl\u00e8me.<\/li>\n<li>le deuxi\u00e8me type est plus \u00ab\u00a0conceptuel\u00a0\u00bb, puisqu&rsquo;il est li\u00e9 \u00e0 l&rsquo;<strong>organisation du tableau<\/strong> : il s&rsquo;agit de bien formaliser ce qui est <strong>variable<\/strong> (ou attribut) et <strong>individu<\/strong> (ou unit\u00e9 d&rsquo;observation), dans notre tableau de donn\u00e9es.<\/li>\n<\/ul>\n<h1>Nettoyer un fichier de donn\u00e9es pour le lire sous R<\/h1>\n<p>En g\u00e9n\u00e9ral, lire un tableau de donn\u00e9es sera la premi\u00e8re chose que vous voudrez faire en travaillant sous R. N\u00e9anmoins, ce n&rsquo;est pas forc\u00e9ment l&rsquo;\u00e9tape la plus facile: en pratique la lecture des tableaux de donn\u00e9es est souvent probl\u00e9matique, par exemple si les noms de colonnes contiennent des <strong>caract\u00e8res sp\u00e9ciaux ou des espaces<\/strong>, si le <strong>s\u00e9parateur d\u00e9cimal du fichier est une virgule<\/strong> et non un point, si le fichier contient des <strong>commentaires<\/strong>, etc.<\/p>\n<p>Ce genre de probl\u00e8mes arrive tr\u00e8s souvent \u00e0 ceux qui travaillent ordinairement avec Excel et pour qui le tableau de donn\u00e9es est \u00e9galement un document de travail (avec des commentaires, des noms de colonnes \u00e0 rallonge destin\u00e9s \u00e0 \u00eatre les plus explicites possible, des graphiques, des mises en forme destin\u00e9es \u00e0 rendre le document plus lisible, etc.).<\/p>\n<p>N&rsquo;oubliez que pour R, ce tableau est cens\u00e9 ne comporter que de la donn\u00e9e <strong>BRUTE<\/strong>!&#8230; Veillez donc \u00e0 bien \u00ab\u00a0nettoyer\u00a0\u00bb le fichier que vous voulez lire dans R: avoir des <strong>noms de colonnes simples et sans espaces<\/strong>, enlever les commentaires et mises en forme inutiles, etc.<\/p>\n<p>On peut \u00e9galement sp\u00e9cifier certains des arguments de la fonction read.table pour contr\u00f4ler la lecture du fichier. Ces options sont d\u00e9taill\u00e9es dans le fichier d&rsquo;aide associ\u00e9 \u00e0 la fonction: on peut l&rsquo;ouvrir gr\u00e2ce \u00e0 l&rsquo;une ou l&rsquo;autre des commandes suivantes:<\/p>\n<pre><code>help(read.table)\n?read.table\n<\/code><\/pre>\n<p>Les fonctions de la famille de <code>read.table<\/code> (<code>read.csv<\/code>, <code>read.delim<\/code>, etc.) ont pour <strong>argument principal l&rsquo;argument <code>file<\/code><\/strong>, qui indique le chemin du fichier que vous cherchez \u00e0 lire. Attention, dans le chemin indiqu\u00e9, il faut proscrire les \u00ab\u00a0\\\u00a0\u00bb, et les remplacer par \u00ab\u00a0\/\u00a0\u00bb ou \u00ab\u00a0\\\u00a0\u00bb (la raison \u00e0 cela, c&rsquo;est que dans R, l&rsquo;antislash est un caract\u00e8re r\u00e9serv\u00e9 -un \u00ab\u00a0escape character\u00a0\u00bb-).<\/p>\n<p>La plupart du temps, les autres arguments importants pour r\u00e9ussir \u00e0 importer un jeu de donn\u00e9es sont:<\/p>\n<ul>\n<li><code>sep<\/code>: le s\u00e9parateur de colonnes (qui peut \u00eatre <code>\";\"<\/code>, <code>\",\"<\/code>, <code>\" \"<\/code>, <code>\"\"<\/code>, etc.)<\/li>\n<li><code>dec<\/code>: le s\u00e9parateur d\u00e9cimal (qui peut \u00eatre \u00ab\u00a0,\u00a0\u00bb si vous travaillez par exemple avec Excel en VF!)<\/li>\n<li><code>header<\/code> : qui vous permet d&rsquo;indiquer si la premi\u00e8re ligne du fichier correspond \u00e0 des noms de colonnes (<code>header=TRUE<\/code>) ou non<\/li>\n<\/ul>\n<p>Si vous travaillez avec RStudio, vous pouvez aussi utiliser le bouton \u00ab\u00a0<strong>Import Dataset<\/strong>\u00ab\u00a0, dans l&rsquo;onglet \u00ab\u00a0Environnement\u00a0\u00bb, qui reconna\u00eet \u00ab\u00a0intuitivement\u00a0\u00bb (et souvent assez bien) les caract\u00e9ristiques d&rsquo;un fichier de donn\u00e9es.<\/p>\n<h1>Mettre en forme du tableau de donn\u00e9es avec tidyr<\/h1>\n<p>Passons maintenant \u00e0 la question de la structure du jeu de donn\u00e9es. Dans l&rsquo;id\u00e9al, un jeu de donn\u00e9es devrait \u00eatre structur\u00e9 de la mani\u00e8re suivante:<\/p>\n<pre><code>##           Variable1 Variable2 Variable3\n## individu1       ...       ...       ...\n## individu2       ...       ...       ...\n## individu3       ...       ...       ...\n## individu4       ...       ...       ...\n## individu5       ...       ...       ...\n<\/code><\/pre>\n<p>Ainsi, pour mettre en forme correctement un jeu de donn\u00e9es, il convient de bien d\u00e9finir ce qui est <strong>variable<\/strong>, et ce qui est <strong>individu<\/strong>, et de faire en sorte que les variables apparaissent en <strong>colonne<\/strong>, et les individus en <strong>ligne<\/strong>.<\/p>\n<p>Alors, certes, j&rsquo;ai un peu l&rsquo;impression d&rsquo;enfoncer une porte ouverte&#8230; Mais en pratique, les probl\u00e8mes de structure dans un jeu de donn\u00e9es sont courants, ce qui montre que l&rsquo;exercice n&rsquo;est pas si trivial.<\/p>\n<h2>Exemple: plusieurs colonnes correspondent \u00e0 une m\u00eame variable<\/h2>\n<p>Consid\u00e9rons le jeu de donn\u00e9es suivant, qui porte sur des abondances d&rsquo;oiseaux dans diff\u00e9rents sites touristiques parisiens, \u00e0 diverses dates:<\/p>\n<pre><code>##    Espece                        Site Date1 Date2 Date3\n## 1 moineau Saint-Germain-des-Pr\u00e9s\/6\u00e8me     5    15    13\n## 2 moineau         Champs-Elys\u00e9es\/8\u00e8me     1     3    11\n## 3 moineau            Montmartre\/18\u00e8me    15     6     4\n## 4 moineau       Buttes Chaumont\/19\u00e8me     5    10     8\n## 5  pigeon Saint-Germain-des-Pr\u00e9s\/6\u00e8me     6    21     6\n## 6  pigeon         Champs-Elys\u00e9es\/8\u00e8me    20     3     9\n## 7  pigeon            Montmartre\/18\u00e8me     9    20     3\n## 8  pigeon       Buttes Chaumont\/19\u00e8me     2     6    10\n<\/code><\/pre>\n<p>Si vous souhaitez travailler sur ce m\u00eame exemple, vous trouverez le fichier <a href=\"..\/..\/lise.vaudor\/Rdata\/Nettoyer_ses_donnees\/Oiseaux_parisiens.csv\">ici<\/a>.<\/p>\n<p>Si la mise en forme de ce jeu de donn\u00e9es permet de visualiser facilement l&rsquo;\u00e9volution des abondances de moineau et pigeon au cours du temps, elle pose question dans le sens o\u00f9, en fait, on pourrait consid\u00e9rer que les colonnes Date1, Date2 et Date3 ne renseignent pas des variables diff\u00e9rentes, mais bien la m\u00eame variable&#8230; Ainsi, il vaudrait mieux que le jeu de donn\u00e9es soit organis\u00e9 de la mani\u00e8re suivante:<\/p>\n<pre><code>##     Espece                        Site  Date Abondance\n## 1  moineau Saint-Germain-des-Pr\u00e9s\/6\u00e8me Date1         5\n## 2  moineau         Champs-Elys\u00e9es\/8\u00e8me Date1         1\n## 3  moineau            Montmartre\/18\u00e8me Date1        15\n## 4  moineau       Buttes Chaumont\/19\u00e8me Date1         5\n## 5   pigeon Saint-Germain-des-Pr\u00e9s\/6\u00e8me Date1         6\n## 6   pigeon         Champs-Elys\u00e9es\/8\u00e8me Date1        20\n## 7   pigeon            Montmartre\/18\u00e8me Date1         9\n## 8   pigeon       Buttes Chaumont\/19\u00e8me Date1         2\n## 9  moineau Saint-Germain-des-Pr\u00e9s\/6\u00e8me Date2        15\n## 10 moineau         Champs-Elys\u00e9es\/8\u00e8me Date2         3\n## 11 moineau            Montmartre\/18\u00e8me Date2         6\n## 12 moineau       Buttes Chaumont\/19\u00e8me Date2        10\n## 13  pigeon Saint-Germain-des-Pr\u00e9s\/6\u00e8me Date2        21\n## 14  pigeon         Champs-Elys\u00e9es\/8\u00e8me Date2         3\n## 15  pigeon            Montmartre\/18\u00e8me Date2        20\n## 16  pigeon       Buttes Chaumont\/19\u00e8me Date2         6\n## 17 moineau Saint-Germain-des-Pr\u00e9s\/6\u00e8me Date3        13\n## 18 moineau         Champs-Elys\u00e9es\/8\u00e8me Date3        11\n## 19 moineau            Montmartre\/18\u00e8me Date3         4\n## 20 moineau       Buttes Chaumont\/19\u00e8me Date3         8\n## 21  pigeon Saint-Germain-des-Pr\u00e9s\/6\u00e8me Date3         6\n## 22  pigeon         Champs-Elys\u00e9es\/8\u00e8me Date3         9\n## 23  pigeon            Montmartre\/18\u00e8me Date3         3\n## 24  pigeon       Buttes Chaumont\/19\u00e8me Date3        10\n<\/code><\/pre>\n<p>Dans cette deuxi\u00e8me mise en forme, une observation correspond \u00e0 l&rsquo;abondance d&rsquo;une esp\u00e8ce donn\u00e9e, \u00e0 un endroit donn\u00e9, et \u00e0 une date donn\u00e9e. Dans la mise en forme pr\u00e9c\u00e9dente, une observation correspondait \u00e0 l&rsquo;abondance d&rsquo;une esp\u00e8ce donn\u00e9e, \u00e0 un endroit donn\u00e9.<\/p>\n<p>Et voici maintenant un des avantages que l&rsquo;on a \u00e0 organiser ses donn\u00e9es de la \u00ab\u00a0bonne\u00a0\u00bb mani\u00e8re: il devient facile de r\u00e9aliser des analyses et des graphiques qui retranscrivent correctement le contenu du jeu de donn\u00e9es&#8230; Ici par exemple, on r\u00e9alise tr\u00e8s facilement avec le package ggplot2 un graphique qui montre l&rsquo;ensemble du contenu du jeu de donn\u00e9es:<\/p>\n<pre><code>library(ggplot2)\np=ggplot(mynewdata, aes(x=Date, y=Abondance))\np=p+geom_point(aes(col=Espece,shape=Site))\nplot(p)\n<\/code><\/pre>\n<p><img decoding=\"async\" src=\"..\/..\/lise.vaudor\/Rfigures\/Nettoyer_ses_donnees\/exemple_ggplot-1.png\" alt=\"\" \/><\/p>\n<p>Il serait impossible (ou du moins, difficile et p\u00e9nible) de r\u00e9aliser ce m\u00eame graphique avec le m\u00eame jeu de donn\u00e9es mis en forme selon le premier mod\u00e8le, en tout cas en utilisant la logique \u00ab\u00a0intuitive\u00a0\u00bb de ggplot2, car dans ce cas les colonnes <code>Date1<\/code>, <code>Date2<\/code>, et <code>Date3<\/code> seraient consid\u00e9r\u00e9s a priori comme des variables ind\u00e9pendantes les unes des autres.<\/p>\n<p>Alors, comment passer d&rsquo;une mise en forme \u00e0 l&rsquo;autre? Eh bien, auparavant, pour passer de l&rsquo;un \u00e0 l&rsquo;autre, il fallait soit changer le format de tableau <strong>\u00e0 la main<\/strong> (par exemple, pour ceux qui ne sont pas trop \u00e0 l&rsquo;aise avec les langages de script, \u00e0 coups de copier-coller dans votre tableur favori&#8230;), soit transformer le tableau \u00e0 l&rsquo;aide de <strong>quelques lignes de commande<\/strong> (par exemple sous R, par exemple \u00e0 l&rsquo;aide d&rsquo;une boucle for). Cela pouvait vite \u00eatre long (surtout dans le premier cas), compliqu\u00e9 (surtout dans le deuxi\u00e8me cas), et p\u00e9nible (dans les deux cas).<\/p>\n<p>Heureusement, il existe d\u00e9sormais des packages qui sont l\u00e0 pour nous simplifier la t\u00e2che. Permettez-moi ainsi de vous pr\u00e9senter le package <code>tidyr<\/code>. Comme son nom l&rsquo;indique, l&rsquo;objectif de tidyr (prononcer \u00ab\u00a0tidyer\u00a0\u00bb,in English of course), est de proposer quelques fonctions qui permettent de r\u00e9aliser des <strong>op\u00e9rations classiques<\/strong> lorsque l&rsquo;on <strong>nettoie<\/strong> et <strong>restructure<\/strong> ses jeux de donn\u00e9es. (J&rsquo;ai bien dit \u00ab\u00a0classiques\u00a0\u00bb, hein&#8230; dans certains, cas, il reste utile voire indispensable de savoir un petit peu programmer&#8230;).<\/p>\n<p>Voici par exemple comment passer du jeu donn\u00e9es avec les colonnes <code>Date1<\/code>, <code>Date2<\/code>, et <code>Date3<\/code>, \u00e0 un jeu de donn\u00e9e avec une seule colonne <code>Date<\/code>:<\/p>\n<p>La fonction <code>gather<\/code> prend en entr\u00e9e:<\/p>\n<ul>\n<li><code>data<\/code>: le jeu de donn\u00e9es d&rsquo;origine,<\/li>\n<li><code>key<\/code>: le nom de la variable cat\u00e9gorielle \u00e0 cr\u00e9er, ici <code>Date<\/code> (ses niveaux correspondront aux actuels noms de colonnes de mydata, \u00e0 l&rsquo;exception des colonnes indiqu\u00e9es ici par un \u00ab\u00a0&#8211;\u00a0\u00bb ,i.e., ici, <code>Espece<\/code> et <code>Site<\/code>)<\/li>\n<li><code>value<\/code>: le nom de la nouvelle variable contenant les valeurs auparavant contenues dans <code>Date1<\/code>, <code>Date2<\/code>, <code>Date3<\/code><\/li>\n<\/ul>\n<p><!-- --><\/p>\n<pre><code>print(head(mydata))\n\n##    Espece                        Site Date1 Date2 Date3\n## 1 moineau Saint-Germain-des-Pr\u00e9s\/6\u00e8me     5    15    13\n## 2 moineau         Champs-Elys\u00e9es\/8\u00e8me     1     3    11\n## 3 moineau            Montmartre\/18\u00e8me    15     6     4\n## 4 moineau       Buttes Chaumont\/19\u00e8me     5    10     8\n## 5  pigeon Saint-Germain-des-Pr\u00e9s\/6\u00e8me     6    21     6\n## 6  pigeon         Champs-Elys\u00e9es\/8\u00e8me    20     3     9\n\nprint(head(mynewdata))\n\n##    Espece                        Site  Date Abondance\n## 1 moineau Saint-Germain-des-Pr\u00e9s\/6\u00e8me Date1         5\n## 2 moineau         Champs-Elys\u00e9es\/8\u00e8me Date1         1\n## 3 moineau            Montmartre\/18\u00e8me Date1        15\n## 4 moineau       Buttes Chaumont\/19\u00e8me Date1         5\n## 5  pigeon Saint-Germain-des-Pr\u00e9s\/6\u00e8me Date1         6\n## 6  pigeon         Champs-Elys\u00e9es\/8\u00e8me Date1        20\n<\/code><\/pre>\n<p>N&rsquo;est-ce pas merveilleusement simple?<\/p>\n<p>Notez que <code>gather<\/code> a (en quelque sorte) une fonction inverse, <code>spread<\/code>:<\/p>\n<pre><code>mydataisback=spread(data=mynewdata,\n                    key=Date,\n                    value=Abondance)\nprint(head(mydataisback))\n\n##    Espece                        Site Date1 Date2 Date3\n## 1 moineau       Buttes Chaumont\/19\u00e8me     5    10     8\n## 2 moineau         Champs-Elys\u00e9es\/8\u00e8me     1     3    11\n## 3 moineau            Montmartre\/18\u00e8me    15     6     4\n## 4 moineau Saint-Germain-des-Pr\u00e9s\/6\u00e8me     5    15    13\n## 5  pigeon       Buttes Chaumont\/19\u00e8me     2     6    10\n## 6  pigeon         Champs-Elys\u00e9es\/8\u00e8me    20     3     9\n<\/code><\/pre>\n<h2>Exemple: une m\u00eame colonne correspond \u00e0 plusieurs variables<\/h2>\n<p>Deuxi\u00e8me exemple d&rsquo;op\u00e9ration assez classique: prendre <strong>une colonne<\/strong> (comme <code>Site<\/code> dans le jeu de donn\u00e9es ci-dessus) et en faire <strong>deux variables<\/strong>, \u00e0 l&rsquo;aide de la fonction <code>separate<\/code>&#8230;<\/p>\n<pre><code>finaldata=separate(data=mynewdata,\n                   col=Site,\n                   into=c(\"Quartier\", \"Arrondissement\"),\n                   sep=\"\/\")\nprint(head(finaldata))\n\n##    Espece               Quartier Arrondissement  Date Abondance\n## 1 moineau Saint-Germain-des-Pr\u00e9s           6\u00e8me Date1         5\n## 2 moineau         Champs-Elys\u00e9es           8\u00e8me Date1         1\n## 3 moineau             Montmartre          18\u00e8me Date1        15\n## 4 moineau        Buttes Chaumont          19\u00e8me Date1         5\n## 5  pigeon Saint-Germain-des-Pr\u00e9s           6\u00e8me Date1         6\n## 6  pigeon         Champs-Elys\u00e9es           8\u00e8me Date1        20\n<\/code><\/pre>\n<p>La fonction <code>separate<\/code> prend en entr\u00e9e:<\/p>\n<ul>\n<li><code>data<\/code>: le jeu de donn\u00e9es d&rsquo;origine,<\/li>\n<li><code>col<\/code>: le nom de la colonne \u00e0 s\u00e9parer en plusieurs variables<\/li>\n<li><code>into<\/code>: les noms des nouvelles variables<\/li>\n<\/ul>\n<p>Ici aussi, on a une fonction inverse&#8230; Il s&rsquo;agit de <code>unite<\/code>:<\/p>\n<pre><code>backtomynewdata=unite(finaldata,\n                      col=Site,\n                      Quartier,\n                      Arrondissement,\n                      sep=\"\/\")\nprint(head(mynewdata))\n\n##    Espece                        Site  Date Abondance\n## 1 moineau Saint-Germain-des-Pr\u00e9s\/6\u00e8me Date1         5\n## 2 moineau         Champs-Elys\u00e9es\/8\u00e8me Date1         1\n## 3 moineau            Montmartre\/18\u00e8me Date1        15\n## 4 moineau       Buttes Chaumont\/19\u00e8me Date1         5\n## 5  pigeon Saint-Germain-des-Pr\u00e9s\/6\u00e8me Date1         6\n## 6  pigeon         Champs-Elys\u00e9es\/8\u00e8me Date1        20\n<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Plus je travaille avec R, plus je travaille sur les donn\u00e9es de coll\u00e8gues, et plus je r\u00e9alise l&rsquo;importance (en termes de temps, et en termes de cons\u00e9quences sur l&rsquo;analyse elle-m\u00eame) de l&rsquo;\u00e9tape pr\u00e9alable \u00e0 l&rsquo;analyse: le nettoyage et la mise en forme des donn\u00e9es. En effet, la fa\u00e7on dont on structure son jeu de donn\u00e9es va d&rsquo;une part conditionner notre capacit\u00e9 \u00e0 comprendre, intuitivement, quelles sont les analyses que l&rsquo;on.. <a href=\"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/nettoyer-et-structurer-ses-donnees\/\">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-585","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\/585","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=585"}],"version-history":[{"count":7,"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/posts\/585\/revisions"}],"predecessor-version":[{"id":592,"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/posts\/585\/revisions\/592"}],"wp:attachment":[{"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/media?parent=585"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/categories?post=585"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/tags?post=585"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}