{"id":181,"date":"2014-10-14T11:46:26","date_gmt":"2014-10-14T09:46:26","guid":{"rendered":"http:\/\/perso.ens-lyon.fr\/lise.vaudor\/?p=181"},"modified":"2017-05-23T15:45:41","modified_gmt":"2017-05-23T13:45:41","slug":"boucles-for","status":"publish","type":"post","link":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/boucles-for\/","title":{"rendered":"Faire des boucles for dans R pour automatiser des t\u00e2ches"},"content":{"rendered":"<p><img decoding=\"async\" src=\"..\/..\/lise.vaudor\/Rfigures\/Boucles_for\/headband.png\" alt=\"plot of chunk\nheadband\" \/><\/p>\n<p>La <strong>boucle <code>for<\/code><\/strong> est un peu le B-A BA de la programmation sous <strong>R<\/strong>, mais (pour ceux qui ne connaissent pas), elle a de quoi vous mettre des \u00e9toiles dans les yeux (sans exag\u00e9rer!).<\/p>\n<p>En effet, elle permet de <strong>vous \u00e9viter certaines t\u00e2ches r\u00e9p\u00e9titives<\/strong> en les <strong>automatisant<\/strong>, et ainsi de vous faire gagner beaucoup de temps&#8230;<\/p>\n<p>Voici comment elle est structur\u00e9e:<\/p>\n<pre><code>for (i in 1:n){\n ## t\u00e2che \u00e0 r\u00e9p\u00e9ter n fois pour i variant de 1 \u00e0 n\n}\n<\/code><\/pre>\n<p>On a un <strong>compteur<\/strong> (ici appel\u00e9 <code>i<\/code>) qui varie de <code>1<\/code> \u00e0 <code>n<\/code> par incr\u00e9ment de 1.<\/p>\n<h1>Exemple stupide mais simple:<\/h1>\n<p>Par exemple, si l&rsquo;on veut afficher 10 fois de suite \u00ab\u00a0Bonjour!\u00a0\u00bb \u00e0 l&rsquo;\u00e9cran, on peut proc\u00e9der ainsi:<\/p>\n<pre><code>for (i in 1:10){\n  print(\"Bonjour!\")\n  print(i)\n}                                                                                                                                                                                                                                                                                                                                                                                                   \n\n## [1] \"Bonjour!\"\n## [1] 1\n## [1] \"Bonjour!\"\n## [1] 2\n## [1] \"Bonjour!\"\n## [1] 3\n## [1] \"Bonjour!\"\n## [1] 4\n## [1] \"Bonjour!\"\n## [1] 5\n## [1] \"Bonjour!\"\n## [1] 6\n## [1] \"Bonjour!\"\n## [1] 7\n## [1] \"Bonjour!\"\n## [1] 8\n## [1] \"Bonjour!\"\n## [1] 9\n## [1] \"Bonjour!\"\n## [1] 10\n<\/code><\/pre>\n<p>Voici ce qui se passe:<\/p>\n<ul>\n<li>D&rsquo;abord, i=1,<\/li>\n<li>On affiche \u00ab\u00a0Bonjour!\u00a0\u00bb, puis la valeur de i<\/li>\n<li>La valeur de i est incr\u00e9ment\u00e9e de 1 (i.e., d\u00e9sormais, i=2)<\/li>\n<li>On revient au d\u00e9but du code ins\u00e9r\u00e9 dans la boucle<\/li>\n<li>On affiche \u00ab\u00a0Bonjour!\u00a0\u00bb, puis la valeur de i<\/li>\n<li>La valeur de i est incr\u00e9ment\u00e9e de 1 (i.e., d\u00e9sormais, i=3)<\/li>\n<li>On revient au d\u00e9but du code ins\u00e9r\u00e9 dans la boucle<\/li>\n<li>etc.(La derni\u00e8re it\u00e9ration correspond \u00e0 i=n)<\/li>\n<\/ul>\n<h1>Exemple intelligent mais un peu moins simple:<\/h1>\n<p>Afficher \u00ab\u00a0Bonjour!\u00a0\u00bb dans la console R n&rsquo;\u00e9tant pas, en soi, un objectif de travail tr\u00e8s r\u00e9aliste, voyons maintenant un \u00ab\u00a0vrai\u00a0\u00bb exemple de travail.<\/p>\n<p>Imaginons que l&rsquo;on souhaite travailler sur les donn\u00e9es <a href=\"..\/..\/lise.vaudor\/\/Rdata\/Boucles_for\/data_boucles_for.csv\">disponibles ici<\/a>.<\/p>\n<p>Il s&rsquo;agit des salaires moyens (en euros) en France selon la cat\u00e9gorie socio-professionnelle et le sexe entre 1984 et 2010 (<a href=\"http:\/\/www.insee.fr\/fr\/bases-de-donnees\/\">donn\u00e9es INSEE<\/a>).<\/p>\n<ul>\n<li>ChEntr: chefs d&rsquo;entreprise<\/li>\n<li>CadSup: cadres et professions intellectuelles sup\u00e9rieures<\/li>\n<li>ProfInt: professions interm\u00e9diaires<\/li>\n<li>Employ: employ\u00e9s<\/li>\n<li>Ouvri: ouvriers<\/li>\n<li>ApprStag: apprentis et stagiaires<\/li>\n<\/ul>\n<p><!-- --><\/p>\n<pre><code>data_boucles_for=read.csv(paste(dat.path,\"data_boucles_for.csv\",sep=\"\"), sep=\";\")\nprint(data_boucles_for[1:10,])\n\n##    ANNEE  SEXE ChEntr Cadres ProfInt Employ Ouvri ApprStag\n## 1   1984 Homme  32464  28479   16716  11752 10063     3959\n## 2   1984 Femme  18169  19090   13200   9443  7754     4062\n## 3   1985 Homme  34827  29764   17710  12236 10813     4046\n## 4   1985 Femme  20493  19682   13921  10011  8359     4243\n## 5   1986 Homme  38614  31047   18389  13034 11311     4574\n## 6   1986 Femme  21135  20478   14418  10532  8761     4602\n## 7   1987 Homme  37625  32814   18431  12544 11470     4588\n## 8   1987 Femme  23259  22960   14612  10653  8863     4455\n## 9   1988 Homme  38799  33692   18709  12780 11745     4788\n## 10  1988 Femme  23298  23760   14952  10893  9050     4713\n\nattach(data_boucles_for)\n<\/code><\/pre>\n<p>Si l&rsquo;on veut produire un graphique repr\u00e9sentant l&rsquo;\u00e9volution des salaires au cours du temps <strong>pour chaque cat\u00e9gorie socioprofessionnelle<\/strong> en distinguant les hommes et les femmes, voici comment on peut proc\u00e9der.<\/p>\n<p>Voici les variables du jeu de donn\u00e9es:<\/p>\n<pre><code>colnames(data_boucles_for)\n\n## [1] \"ANNEE\"    \"SEXE\"     \"ChEntr\"   \"Cadres\"   \"ProfInt\"  \"Employ\"   \"Ouvri\"    \"ApprStag\"\n<\/code><\/pre>\n<p>Les donn\u00e9es pour chaque cat\u00e9gorie socio-professionnelle se trouvent sur les colonnes 3 \u00e0 8<\/p>\n<pre><code># On divise la fen\u00eatre graphique en 6 sous-fen\u00eatres\nlayout(matrix(1:6,nrow=2))\n# On veut r\u00e9p\u00e9ter les m\u00eames instructions pour j variant de 3 \u00e0 8:\nfor (j in 3:8){\n  # On trace un nuage de points qui correspond \u00e0 l'ensemble des donn\u00e9es \n  # (hommes et femmes)\n  plot(ANNEE, data_boucles_for[,j], \n       main=colnames(data_boucles_for)[j],\n       ylab=\"salaire net annuel\")\n  # On s\u00e9lectionne les donn\u00e9es qui correspondent aux femmes\n  # pour tracer la s\u00e9rie en rouge\n  indf=which(SEXE==\"Femme\")\n  points(ANNEE[indf],data_boucles_for[indf,j], col=\"red\", type=\"b\")\n  # On s\u00e9lectionne les donn\u00e9es qui correspondent aux hommes \n  # pour tracer la s\u00e9rie en bleu\n  indh=which(SEXE==\"Homme\")\n  points(ANNEE[indh],data_boucles_for[indh,j], col=\"blue\", type=\"b\")\n}\n<\/code><\/pre>\n<p><img decoding=\"async\" src=\"..\/..\/lise.vaudor\/Rfigures\/Boucles_for\/graphique_pour_chaque_categorie.png\" alt=\"plot of chunk\ngraphique_pour_chaque_categorie\" \/><\/p>\n<h1>Exemple encore plus intelligent mais encore moins simple:<\/h1>\n<p>On peut <strong>imbriquer<\/strong> des boucles for. Consid\u00e9rons \u00e0 nouveau le graphique pr\u00e9c\u00e9dent. On fait en fait deux fois la m\u00eame chose pour les hommes et les femmes&#8230; De ce fait il serait possible de faire une deuxi\u00e8me boucle \u00e0 l&rsquo;int\u00e9rieur de la premi\u00e8re:<\/p>\n<pre><code># On divise la fen\u00eatre graphique en 6 sous-fen\u00eatres\nlayout(matrix(1:6,nrow=2))\n# On veut r\u00e9p\u00e9ter les m\u00eames instructions pour j variant de 3 \u00e0 8:\nfor (j in 3:8){\n  # On trace un nuage de points qui correspond \n  # \u00e0 l'ensemble des donn\u00e9es (hommes et femmes)\n  plot(ANNEE, data_boucles_for[,j], \n       main=colnames(data_boucles_for)[j],\n       ylab=\"salaire net annuel\")\n  # On s\u00e9lectionne les donn\u00e9es qui correspondent aux femmes (k=1)\n  # puis aux hommes (k=2) pour tracer les s\u00e9ries en rouge puis en bleu\n  for (k in 1:2){\n      ind=which(SEXE==c(\"Femme\",\"Homme\")[k])\n      points(ANNEE[ind],data_boucles_for[ind,j], col=c(\"red\",\"blue\")[k], type=\"b\")\n  }\n}\n<\/code><\/pre>\n<p>Ici on produit exactement le m\u00eame graphique que ci-dessus. L&rsquo; \u00ab\u00a0\u00e9conomie\u00a0\u00bb en temps (et en nombre de lignes de code) n&rsquo;est certes pas tr\u00e8s important dans la mesure o\u00f9 l&rsquo;on n&rsquo;a r\u00e9p\u00e9t\u00e9 le processus que deux fois, mais cet exemple permet de comprendre le principe des boucles imbriqu\u00e9es&#8230;<\/p>\n<p>Notez que l&rsquo;ordre des boucles a son importance!!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>La boucle for est un peu le B-A BA de la programmation sous R, mais (pour ceux qui ne connaissent pas), elle a de quoi vous mettre des \u00e9toiles dans les yeux (sans exag\u00e9rer!). En effet, elle permet de vous \u00e9viter certaines t\u00e2ches r\u00e9p\u00e9titives en les automatisant, et ainsi de vous faire gagner beaucoup de temps&#8230; Voici comment elle est structur\u00e9e: for (i in 1:n){ ## t\u00e2che \u00e0 r\u00e9p\u00e9ter n.. <a href=\"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/boucles-for\/\">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-181","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\/181","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=181"}],"version-history":[{"count":6,"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/posts\/181\/revisions"}],"predecessor-version":[{"id":412,"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/posts\/181\/revisions\/412"}],"wp:attachment":[{"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/media?parent=181"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/categories?post=181"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/tags?post=181"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}