Je vous recommande de lire les sections 1 Ă  5 de ce document avant la sĂ©ance afin de se concentrer sur l’apprentissage (sections 6 Ă  9). Les sections 10 Ă  15 sont en quelque sorte des annexes, que je vous conseille de lire aprĂšs le didacticiel.

1. But du didacticiel

En 2-3h, il est impossible de maitriser R. Par contre, il y a certains aspects de la logique de R qui sont essentiels Ă  comprendre et Ă  acquĂ©rir pour pouvoir apprendre par soi-mĂȘme. Je vais donc essayer de vous fournir ces bases. Ce n’est pas la partie la plus intĂ©ressante, mais c’est la plus dĂ©licate Ă  apprendre. Si vous maitrisez cette partie, alors vous serez indĂ©pendant sous R. Ces aspects concernent principalement les types (section 7) et structures des objets (section 8), ainsi que la manipulation de ces objets (section 9).

Ce didacticiel concerne uniquement l’utilisation de R, sa logique et sa syntaxe. Les applications (graphiques, statistiques
) ne sont pas abordĂ©es pour plusieurs raisons. Tout d’abord, chacun utilise R pour diffĂ©rentes raisons et applications. En plus, les applications sont quasiment infinies ; il est donc impossible de tout traiter. Ensuite, en commençant par les applications sans connaitre le fonctionnement, vous arriverez sĂ»rement Ă  utiliser R en reproduisant des bouts de codes trouvĂ©s un peu partout, mais sans forcĂ©ment les comprendre et donc sans pouvoir les adapter Ă  vos besoins. Vous finirez sĂ»rement par comprendre comment R fonctionne, mais l’apprentissage sera beaucoup plus long (je dis ça par expĂ©rience). Enfin, si le fonctionnement est compris, vous aurez les bases pour apprendre les diffĂ©rentes applications.

Je vais vous embĂȘter avec des questions de terminologie et je vais essayer de vous inculquer des habitudes de codage. Il est important de prendre l’habitude d’utiliser les bons termes (pour pouvoir Ă©changer avec des collĂšgues) et de bien organiser votre code (pour qu’il soit plus lisible).


2. Qu’est-ce que R ?

R est un logiciel libre permettant de manipuler et analyser des donnĂ©es et de rĂ©aliser des graphiques. Il n’y a quasiment pas de menus, tout se fait par des lignes de commande (voir aussi Rcmdr et easieR). Ça rend les choses difficiles, surtout au dĂ©but, mais c’est aussi grĂące Ă  cela que tout est possible ; on n’est pas limitĂ© par ce qui est proposĂ© dans les menus.

R est dĂ©veloppĂ© par une communautĂ© d’utilisateurs, qui peuvent contribuer sous la forme de packages. Il existe des milliers de packages qui contiennent des fonctions permettant d’effectuer des opĂ©rations particuliĂšres.


3. Comment installer R ?

Tout est disponible sur le site du R-Project : http://www.r-project.org/
Dans la liste Ă  gauche, cliquer sur ‘CRAN’ (Comprehensive R Archive Network) dans la catĂ©gorie ‘Download’ puis choisir un mirroir de tĂ©lĂ©chargement.
Dans l’encadrĂ© ‘Download and Install R’, cliquer sur le lien correspondant au systĂšme d’exploitation.

3.1. Windows

Cliquer sur ‘base’ ou ‘install R for the first time’, puis ‘Download R 3.3.1 for Windows’. TĂ©lĂ©charger puis exĂ©ctuer le fichier d’installation. Suivre les instructions.

Vous pouvez choisir de n’installer que la version 64-bit, et d’installer les traductions de messages (les traductions ne sont pas toujours disponibles ni exactes, mais ça peut aider).
‘Options de dĂ©marrage’ : si vous cliquez sur ‘oui’, vous pourrez choisir le mode d’affichage de R, soit dans une seule grande fenĂȘtre (pratique si vous n’avez qu’un Ă©cran, mode par dĂ©faut), soit dans des fenĂȘtres sĂ©pararĂ©es (pratique si vous avez 2 Ă©crans).

En plus de R, il est recommandĂ© d’installer RStudio (cf. 3.4).

En cas de problĂšme, contacter Nicolas Stefaniak (nicolas.stefaniak@univ-reims.fr).

3.2. Mac OS

Il est recommandĂ© d’utiliser un ordinateur avec Mac OS 10.9 (Mavericks) ou supĂ©rieur, mĂȘme si les versions Ă  partir de 10.6 (Snow Leopard) sont supportĂ©es (l’installation de packages est cependant plus compliquĂ©e).

TĂ©lĂ©charger le fichier d’installation (‘R-3.3.1.pkg’) et lancer l’installation. Suivre les instructions.

Dans le dĂ©tail concernant le fichier d’installation, il est expliquĂ© que la derniĂšre version de XQuartz est nĂ©cessaire. TĂ©lĂ©charger (https://www.xquartz.org/) et installer XQuartz.

Il est Ă©galement possible d’utiliser RStudio (cf. 3.4), mĂȘme si cela n’apporte pas grand chose sous Mac pour l’utilisateur moyen.

En cas de problĂšme, me contacter (ivan.calandra@univ-reims.fr).

3.3. Linux

Pour installer R sous Ubuntu (une version LTS (14.04 ou 16.04) est préférable) ou une autre distribution de Linux, il suffit de chercher et installer les paquets r-base et r-base-dev depuis le gestionnaire de paquets.

Il est Ă©galement possible d’ajouter le site du CRAN Ă  la liste des dĂ©pĂŽts, de sorte Ă  ce que les packages de R puissent ĂȘtre tĂ©lĂ©chargĂ©s, installĂ©s et mis Ă  jour depuis le gestionnaire de paquets. Consulter la section ‘Download R for Linux’ sur le site https://cran.r-project.org/ pour plus de dĂ©tails.

En plus de R, il est recommandĂ© d’installer RStudio (cf. 3.4).

En cas de problÚme, contacter Philippe Regnault (philippe.regnault@univ-reims.fr) ou Frédéric Blanchard (frederic.blanchard@univ-reims.fr).

3.4. RStudio

RStudio est une interface pour R qui amĂ©liore notamment les fonctionalitĂ©s de l’éditeur (couleurs, fermetures automatiques de parenthĂšses et guillemets, vĂ©rification de syntaxe
 cf. 5.2) et est particuliĂšrement recommandĂ©e pour les utilisateur de Windows et Linux.

Aller sur le site de RStuduio (https://www.rstudio.com/) puis cliquer sur ‘Download RStudio’ puis ‘Download RStudio Desktop’ et tĂ©lĂ©charger le fichier d’installation correspondant au systĂšme d’exploitation (‘RStudio 0.99.903 - 
’) dans la catĂ©gorie ‘Installers’ en bas de la page. Lancer l’installation et suivre les instructions.


4. Document

Avant de continuer, voici quelques petites précisions concernant ce document.

Ce document contient du texte et du code R. Le code est en grisĂ©, et l’output dans des cadres blancs.

Dans les exercices ci-dessous, le code sera cachĂ© par dĂ©faut. Essayez avant d’afficher le code. Vous pourrez ensuite l’afficher (bouton hide/code Ă  droite) pour vĂ©rifier si votre rĂ©ponse est correcte. Des explications sont Ă©galement donnĂ©es juste en dessous du code. Donc ne descendez pas trop vite dans le document.

Notez aussi que j’utilise le point comme symbole de dĂ©cimale contrairement Ă  la nomenclature française, mais c’est le symbole utilisĂ© par R !

Si vous remarquez des erreurs, fautes de frappe, d’orthographe ou autres, merci de me les signaler !


5. Les fenĂȘtres R

5.1. La console

Lorsque vous ouvrez R, vous trouvez une barre de menu et une fenĂȘtre intitulĂ©e R Console. C’est dans cette fenĂȘtre qu’il faut Ă©crire les commandes. Le symbole > suivi du curseur clignotant indique que R est prĂȘt !
Certaines opĂ©rations sont longues ; tant que le > et le curseur ne sont pas affichĂ©s sur la derniĂšre ligne de la console, R est en train de travailler. Dans ce cas lĂ , il faut attendre ! En cas de problĂšmes, le bouton STOP peut arrĂȘter les opĂ©rations en cours.

Les commandes (input), les rĂ©sultats (output), les messages (warnings) et erreurs (errors) s’affichent tous dans la console, dans diffĂ©rentes couleurs. Prenez l’habitude de lire ces messages ; mĂȘme s’ils vous semblent obscurs, c’est grĂące Ă  eux que vous pourrez identifier d’oĂč viennent les problĂšmes. Les erreurs notamment sont souvent dĂ©courageantes, mais il est essentiel de les comprendre. Si vous ne comprenez pas ce que ces messages signifient, un copier/coller dans un moteur de recherche devrait vous aider.

Il est possible de naviguer dans les commandes précédemment entrées en appuyant sur les flÚches haut/bas sur le clavier.

5.2. L’éditeur

En allant dans la barre de menu, vous pouver crĂ©er un document, soit avec l’icĂŽne soit dans Fichier > Nouveau document/script. Une nouvelle fenĂȘtre s’ouvre : l’éditeur. C’est dans l’éditeur que vous allez crĂ©er des scripts, c’est-Ă -dire des fichiers qui contiennent une liste de commandes qui pourront ĂȘtre exĂ©cutĂ©es sur plusieurs jeux de donnĂ©es. Il est possible de sauvegarder ces scripts comme n’importe quel fichier (CTRL+s sous Windows ou cmd+s sous MacOS). Je vous conseille donc, mĂȘme en phase d’apprentissage, d’écrire toutes vos commandes dans l’éditeur et de sauvegarder le fichier, plutĂŽt que d’enregistrer l’espace de travail (cf. 5.3).

Dans l’éditeur, il suffit de sĂ©lectionner les commandes Ă  exĂ©cuter et d’appuyer sur CTRL+r (Windows) ou cmd+ENTER (MacOS) pour envoyer vers la console automatiquement. C’est plus simple et plus sĂ»r que le copier/coller.

Le symbole # permet d’insĂ©rer des commentaires dans du code R. N’hĂ©sitez pas Ă  commenter vos scripts !

L’éditeur sous MacOS est vraiment bien. Pour les utilisateurs Windows et Linux, je vous conseille d’utiliser RStudio (cf. 3.4 et 5.4).

5.3. Quitter R

Quand vous quittez R, une fenĂȘtre s’ouvre vous demandant si vous voulez sauver l’image de l’espace de travail. Il est conseillĂ© de ne pas sauvegarder l’espace de travail afin d’éviter que les objets (et leurs erreurs) restent en mĂ©moire lors de l’ouverture d’une nouvelle session.

5.4. RStudio

Les choses sont un peu diffĂ©rentes dans RStudio (cf. 3.4), mais les mĂȘmes fenĂȘtres sont prĂ©sentes : la console et l’éditeur, plus deux autres fenĂȘtres (fichiers, packages, graphiques, aide, et historique). Il est possible de rĂ©organiser ces fenĂȘtres dans les prĂ©fĂ©rences/options.


6. Qu’est-ce qu’un objet ?

Pour les exemples ci-dessous ainsi que dans le reste du document, vous pouvez copier/coller le code dans la console (ou mieux, dans votre script puis l’envoyer Ă  la console) pour essayer par vous-mĂȘme de comprendre comment ça marche. N’hĂ©sitez pas Ă  essayer ce qui vous passe par la tĂȘte ; le meilleur moyen pour apprendre est d’essayer et de faire des erreurs !

6.1. Définition

R travaille avec des objets : les donnĂ©es sont sauvegardĂ©es dans des objets, on manipule et travaille avec ces objets, et on exĂ©cute des opĂ©rations sur ces objets. Autrement dit, un objet est l’unitĂ© de base dans R, une variable qui peut contenir tout type et structure de donnĂ©es (cf. 7-8). Cela implique que les donnĂ©es doivent ĂȘtre stockĂ©es dans un objet pour pouvoir les manipuler : mĂȘme si les donnĂ©es peuvent apparaitre dans la console, R ne pourra pas travailler dessus si elles ne sont pas stockĂ©es dans un objet.

Pour aider Ă  la comprĂ©hension de la notion d’objet, voici une analogie : vous allez manger chez des amis qui vous proposent un plat merveilleux. Si vous rentrez chez vous ainsi, vous aurez uniquement savourĂ© ce plat. En revanche, si vous leur demandez la recette, vous pourrez la rĂ©utiliser pour d’autres repas. Le fait d’avoir mangĂ© le repas correspond dans R Ă  exĂ©cuter une commande. Le fait de garder en mĂ©moire la recette correspond au fait de garder l’objet en mĂ©moire pour pouvoir l’utiliser ultĂ©rieurement.

Les objets n’existent que dans l’espace de travail tant qu’ils ne sont pas sauvegardĂ©s en tant que fichiers. Ce qui veut dire que :

  • les fichiers de donnĂ©es importĂ©s dans R ne sont pas modifiĂ©s (sauf si vous les Ă©crasez en sauvegardant des objets R portant le mĂȘme nom que les fichiers de donnĂ©es importĂ©s)
  • si vous fermez R, tous les objets non sauvegardĂ©s seront supprimĂ©s

6.2. Assignation

La plupart du temps, vous crĂ©erez un objet directement Ă  partir de l’output d’une fonction, d’un autre objet, ou de valeurs numĂ©riques ou caractĂšres. Pour assigner des donnĂ©es Ă  un objet, il faut utiliser le symbole :

  • <- (infĂ©rieur Ă , suivi d’un tiret sans espace entre les deux) ou
  • = (mais que je ne conseille pas pour Ă©viter les confusions, cf. 7.4 et 10.1)

Je conseille de toujours laisser un espace avant et aprĂšs ces symboles pour que le code soit propre.

Par exemple, pour assigner la valeur 1 à un objet nommé x (qui sera de mode numérique) :
x <- 1

Les valeurs ont Ă©tĂ© assignĂ©es Ă  x, mais aucun ‘rĂ©sultat’ n’apparait dans la console. On a en effet juste demandĂ© Ă  R de crĂ©er x, on ne lui a pas demandĂ© d’afficher x. Pour afficher le contenu d’un objet, il suffit de taper son nom dans la console :
x

[1] 1

Remarquez que si vous tapez 1 dans la console, R vous affichera directement la valeur 1 dans la console, montrant qu’aucun objet n’a Ă©tĂ© créé ; on a juste demandĂ© Ă  R d’afficher la valeur 1 :
1

[1] 1

Il est aussi possible de stocker des informations plus complexes. Par exemple, il est possible de concaténer (combiner) des valeurs avec la fonction c(), en séparant les valeurs par des virgules :
y <- c(1.5, 3, 10.05)
y

[1]  1.50  3.00 10.05

La fonction : créé une suite d’entiers entre deux limites. Pour stocker une suite d’entiers de 1 Ă  10 dans un objet nommĂ© z :
z <- 1:10
z

 [1]  1  2  3  4  5  6  7  8  9 10

Pour assigner la moyenne (fonction mean()) d’une suite d’entiers de 1 Ă  10 Ă  un objet appelĂ© moyenne1 :
moyenne1 <- mean(1:10)
moyenne1

[1] 5.5

Il est Ă©galement possible d’utiliser des objets créés prĂ©cĂ©demment :
moyenne2 <- mean(x)
moyenne2

[1] 1

Les deux moyennes sont identiques car x contient les valeurs 1 Ă  10. Dans le cas de moyenne2, on a appliquĂ© la fonction mean() Ă  un objet x. Le fait d’appliquer des opĂ©rations nouvelles Ă  des objets stockĂ©s dans la mĂ©moire est la maniĂšre dont R fonctionne.

6.3. Nom des objets

Vous pouvez choisir le nom des objets comme vous le voulez. Mais faites en sorte que vous compreniez ce que cet objet contient !

Par ailleurs, il existe 3 rĂšgles importantes pour le nom des objets :

  • le nom peut contenir des chiffres, mais doit commencer par un caractĂšre
  • . et _ sont des symboles valides, le premier Ă©tant aussi permis au dĂ©but du nom. Les autres caractĂšres spĂ©ciaux/symboles ne sont pas permis dans le nom
  • R est sensible Ă  la casse (diffĂ©rencie les majuscules des minuscules)

Exemples de noms valides et différents : mes.donnees, mes_donnees, Mes.Donnees
Exemples de noms non valides : 2donnees, /donnees, $donnees

Une erreur fréquente dans R est : Error: object 'x' not found
Il y a 3 possibilités :

  • Vous avez mal tapĂ© le nom de l’objet (n’oubliez pas que R diffĂ©rencie les majuscules des minuscules)
  • Cet objet n’existe pas car vous ne l’avez pas créé (pas d’assignement effectuĂ©). Il est possible d’afficher les objets existants dans l’espace de travail en tapant ls() dans la console
  • Vous vouliez une suite de caractĂšres et pas un nom d’objet ; dans ce cas, utilisez des guillemets

7. Les modes

Les objets peuvent ĂȘtre de diffĂ©rents modes et classes (cf. 8).

Le mode d’un objet correspond au type de donnĂ©es qu’il contient.
Les modes principaux de R sont : numĂ©rique (numeric), caractĂšre (character), logique (logical) et fonction (function). Les noms entre parenthĂšses sont les noms utilisĂ©s par R ; les traductions françaises n’ont aucune valeur dans R !

Il est possible de vĂ©rifier le mode d’un objet avec la fonction mode() :
x <- 1:10
mode(x)

[1] "numeric"

7.1. Numérique

Les objets de mode numérique contiennent évidemment des nombres : entier (1 ; 20 ; 500 ; -3), réel (1.00 ; 20.25 ; 500.1 ; -3.55) ou complexe (3+2i).

7.2. CaractĂšre

Un caractĂšre est une valeur contenant au moins une lettre : “abc”, “a1c”, “2bc”, " 2" (notez l’espace avant le 2). Dans R, les caractĂšres apparaitront toujours entre guillemets. Les guillemets peuvent ĂȘtre simples (‘exemple’) ou doubles (“exemple”) ; il faut juste que le guillemet de fermeture soit le mĂȘme que celui d’ouverture.

7.3. Logique

Le mode logique ne correspond qu’à deux valeurs possibles : TRUE et FALSE, en capitales sans guillemets. Lorsqu’elles sont converties en numĂ©riques, ces valeurs correspondent Ă  1 et 0 respectivement.

Si vous cherchez de la documentation, vous trouverez parfois les abréviations T et F. Cela suffit la plupart du temps, mais il est fortement conseillé de toujours utiliser les versions complÚtes TRUE et FALSE.

7.4. Fonction

7.4.1. Généralités

Une fonction applique une ou plusieurs opĂ©rations Ă  des donnĂ©es et en sort un rĂ©sultat. De nombreuses fonctions existent dans l’installation de base de R (par exemple mean()), et il en existe encore plus dans les packages. Vous pouvez aussi crĂ©er vos propres fonctions.

Un objet de mode fonction ne contient pas de rĂ©sultat mais uniquement une suite d’opĂ©rations. Il est possible d’afficher cette suite d’opĂ©rations en tapant le nom de la fonction (une fonction est un objet) dans la console, par exemple mean :

function (x, ...) 
UseMethod("mean")
<bytecode: 0x7f7fb219d2e0>
<environment: namespace:base>

Mais en gĂ©nĂ©ral, vous voulez appeler (call) cette fonction sur un objet de donnĂ©es (input), et assigner le rĂ©sultat (output) Ă  un autre objet. Dans ce cas lĂ , il faudra utiliser des parenthĂšses aprĂšs le nom de la fonction pour indiquer que l’on appelle la fonction et que l’on cherche Ă  appliquer les opĂ©rations.
C’est ce que nous avons vu prĂ©cĂ©demment :
x <- c(3,4,6,8,12,15,20) on appelle la fonction c() pour concaténer des valeurs dans x
x

[1]  3  4  6  8 12 15 20

mode(x) on appelle la fonction mode() pour afficher le mode de x

[1] "numeric"

mean(x) on appelle la fonction mean() pour calculer la moyenne de x

[1] 9.714286

Pour afficher l’aide d’une fonction, il suffit de taper son nom prĂ©cĂ©dĂ© d’un point d’interrogation, ou d’utiliser la fonction help(), dans la console (cf. 13) :
?mean
help(mean)

7.4.2. Arguments

Les arguments sont les options de la fonction. Ils possĂšdent toujours des noms que l’on peut trouver dans la dĂ©finition de la fonction sur la page d’aide. Les arguments sont tous listĂ©s entre les parenthĂšses de l’appel Ă  la fonction, sĂ©parĂ©s par des virgules, et le symbole = permet d’assigner des valeurs (options) aux arguments.

Il n’est pas nĂ©cessaire d’écrire leur nom pour les modifier, l’ordre suffit.
Certains arguments possĂšdent des valeurs par dĂ©faut, que l’on peut identifier sur la page d’aide : le nom de l’argument est alors suivi du symbole = puis de la valeur par dĂ©faut. Ces valeurs par dĂ©faut sont celles qui seront utilisĂ©es si l’on n’assigne pas de valeur lors de l’appel Ă  la fonction.
Si un argument n’a pas de valeur par dĂ©faut, il sera alors nĂ©cessaire d’attribuer une valeur lors de l’appel Ă  la fonction, sinon il y aura une erreur du genre “l’argument x est manquant, avec aucune valeur par dĂ©faut”.

Dans l’appel Ă  la fonction, il existe trois possibilitĂ©s pour utiliser les arguments :

  • ne pas lister des arguments pour utiliser les valeurs par dĂ©faut (possible seulement pour les arguments qui en possĂšdent)
  • nommer des arguments pour leur attribuer des valeurs avec le symbole = ; les arguments non nommĂ©s utiliseront alors les valeurs par dĂ©faut
  • attribuer des valeurs aux arguments sans les nommer mais en conservant l’ordre des arguments comme dĂ©fini dans la fonction ; il n’est pas nĂ©cessaire d’attribuer des valeurs Ă  tous les arguments, si vous listez 3 valeurs par exemple, ces valeurs correspondront aux 3 premiers arguments et les valeurs par dĂ©faut seront utilisĂ©es pour les arguments suivants
7.4.3. Exemple

Prenons l’exemple de la fonction matrix() qui sert Ă  crĂ©er des matrices et que nous utiliserons dans la section 8.2.
Sa page d’aide indique qu’elle comporte 5 arguments nommĂ©s data, nrow, ncol, byrow et dimnames, dans cet ordre.
Ils ont tous des valeurs par dĂ©faut car ils sont tous suivi de = et d’une valeur (respectivement : NA, 1, 1, FALSE et NULL).

L’argument data demande les donnĂ©es entrantes (input). Par dĂ©faut, des valeurs manquantes (NA ou ‘not available’, qui correspondent aux cases vides sous Excel) remplissent la matrice. Les arguments nrow et ncol indiquent le nombre de lignes et de colonnes respectivement, par dĂ©faut 1 ligne et 1 colonne. Laissons de cĂŽtĂ© les autres arguments.

Ces 3 lignes sont identiques et permettent de créer une matrice contenant les entiers de 1 à 10 répartis en 5 lignes et 2 colonnes :

  • matrix(data=1:10, nrow=5, ncol=2) : l’argument data contient les entiers de 1 Ă  10, les arguments nrow et ncol rĂ©partissent les donnĂ©es en 5 lignes et 2 colonnes respectivement ; on utilise les valeurs par dĂ©faut pour les arguments byrow et dimnames, on n’a donc pas besoin de les lister
  • matrix(1:10, 5, 2) : mĂȘme opĂ©ration mais sans nommer les trois premiers arguments. L’ordre est alors essentiel (comparer matrix(1:10, 2, 5) par exemple)
  • matrix(ncol=2, nrow=5, data=1:10) : en nommant les arguments, il est possible de les lister dans le dĂ©sordre

7.5. Exercices

  • CrĂ©ez des objets de modes numĂ©riques, caractĂšres et logiques. VĂ©rifiez leurs modes avec la fonction mode() et comparez les outputs de chaque mode.
  • Testez Ă©galement le mode des quatre fonctions que nous avons utilisĂ©es (mode, mean, c et matrix) en tant qu’objets.
  • CrĂ©ez une matrice mat de 2 lignes et 3 colonnes contenant les 6 premiĂšres lettres de l’alphabet.
  • Combien d’arguments possĂšde la fonction mean() ? Quels sont leurs noms et valeurs par dĂ©faut ?

Réponses :

# Objet de mode numérique
x <- 1:10
mode(x)
# Output sans guillemets
x
    
# Objet de mode caractĂšre
y <- c("abc", "def")
mode(y)
# Output avec guillemets
y
    
# Objet de mode logique
z <- c(TRUE, TRUE, FALSE)
mode(z)
# Output sans guillemets
z
    
# Objets de mode fonction
mode(mean)
mode(mode)
mode(c)
mode(matrix)

# Matrice
let <- c("a","b","c","d","e","f")
mat <- matrix(data=let, nrow=2, ncol=3)
mat <- matrix(let, 2, 3)
mat <- matrix(nrow=2, data=let, ncol=3)

# mean()
# La fonction possĂšde 3 arguments : x, trim et na.rm
# Les valeurs par défaut sont : 0 et FALSE pour trim et na.rm respectivement
# x n'a pas de valeur par défaut ; il est donc obligatoire de lui atrribuer une valeur dans l'appel à la fonction

8. Les classes

La classe d’un objet correspond Ă  sa structure. Je vous prĂ©sente ici les classes principales de R. Il est possible d’en crĂ©er d’autres, et certaines fonctions assignent d’ailleurs d’autres classes aux objets.

8.1. Vecteur

Un vecteur est l’unitĂ© de base dans R. C’est un objet sans dimension.
On peut voir ça comme un ensemble, une collection ou une suite de valeurs (nombres, caractùres
).

Tous les Ă©lĂ©ments (valeurs) d’un vecteur sont du mĂȘme mode. Si besoin, les Ă©lĂ©ments seront convertis en un mode commun. Par exemple, un vecteur contenant la sĂ©quence 1,2,3,a,5 sera de mode caractĂšre, avec les chiffres convertis en caractĂšres (parce que les caractĂšres ne peuvent pas ĂȘtre convertis en nombres).

La fonction c() que nous avons utilisée précédemment (cf. 6.2) permet de concaténer des données en un vecteur (certaines valeurs seront converties si besoin pour avoir un mode commun).

Exemples :
x <- 1:10
mode(x)

[1] "numeric"

class(x)

[1] "integer"

y <- c("a","b","c")
mode(y)

[1] "character"

class(y)

[1] "character"

z <- c(1,2,3,"a",5)
z

[1] "1" "2" "3" "a" "5"

mode(z)

[1] "character"

class(z)

[1] "character"

8.2. Matrice

Les matrices sont des arrays à 2 dimensions. Elles se présentent sous la forme de tableaux.

Exemple (voir aussi 7.4.3) :
mat <- matrix(x, nrow=5, ncol=2)
mat

     [,1] [,2]
[1,]    1    6
[2,]    2    7
[3,]    3    8
[4,]    4    9
[5,]    5   10

mode(mat)

[1] "numeric"

class(mat)

[1] "matrix"

8.3. Array

Un array est un vecteur avec des dimensions. Ça veut dire que tous les Ă©lĂ©ments d’un array doivent ĂȘtre de mĂȘme mode. De plus, le nombre d’élĂ©ments doit ĂȘtre divisible par la longueur des dimensions : dans le cas d’une matrice (2D array), le nombre d’élĂ©ments doit ĂȘtre Ă©gal au nombre de colonnes multipliĂ© par le nombre de lignes.

Exemple :
arr <- array(1:12, dim=c(2,3,2))
arr

, , 1

     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6

, , 2

     [,1] [,2] [,3]
[1,]    7    9   11
[2,]    8   10   12

Nombre d’élĂ©ments = 1:12 = 12
Longueur des dimensions = 2x3x2 = 12

mode(arr)

[1] "numeric"

class(arr)

[1] "array"

8.4. Liste

C’est la particularitĂ© de R. Les listes sont les objets les plus flexibles : les Ă©lĂ©ments peuvent ĂȘtre de modes et longueurs diffĂ©rentes.
Une liste peut avoir une structure hiĂ©rarchique, ce qui veut dire que chaque Ă©lĂ©ment d’une liste peut ĂȘtre un vecteur, un array ou une liste et ainsi de suite. La seule contrainte est que chaque Ă©lĂ©ment de niveau le plus bas est un vecteur ; ses Ă©lĂ©ments sont donc tous du mĂȘme mode.

Exemples :
my.list <- list(a=1:3, b=c("a","d"))
my.list

$a
[1] 1 2 3

$b
[1] "a" "d"

mode(my.list)

[1] "list"

class(my.list)

[1] "list"

Une liste est de mode et classe ‘liste’ !

my.list2 <- list(a=list(num=1:3,let=c("a","b")), b=mat, d=c(4,5,"6d",7))
my.list2

$a
$a$num
[1] 1 2 3

$a$let
[1] "a" "b"


$b
     [,1] [,2]
[1,]    1    6
[2,]    2    7
[3,]    3    8
[4,]    4    9
[5,]    5   10

$d
[1] "4"  "5"  "6d" "7" 

my.list2 est une liste composée de 3 éléments (a, b et d)
L’élĂ©ment 1 de my.list2 s’appelle a et est une liste composĂ©e de 2 Ă©lĂ©ments (num et let)
L’élĂ©ment 1 de a s’appelle num et est un vecteur de mode numĂ©rique composĂ© de 3 Ă©lĂ©ments (1, 2 et 3)
L’élĂ©ment 2 de a s’appelle let et est un vecteur de mode caractĂšre composĂ© de 2 Ă©lĂ©ments (a et b, qui n’ont rien Ă  voir avec les Ă©lĂ©ments de my.list2)

L’élĂ©ment 2 de my.list2 s’appelle b et est une matrice de mode numĂ©rique dont les valeurs sont issues de mat

L’élĂ©ment 3 de my.list2 s’appelle d et est un vecteur de mode caractĂšre composĂ© de 4 Ă©lĂ©ments ("4", "5", "6d" et "7", tous convertis en caractĂšre)

Lorsque les lignes de codes deviennent longues et complexes avec plusieurs fonctions imbriquĂ©es, utilisez les espaces de façon intelligente pour sĂ©parer les unitĂ©s. Dans l’exemple de my.list2, je n’ai mis des espaces entre les arguments que pour sĂ©parer les Ă©lĂ©ments de my.list2. Les arguments permettant de dĂ©finir la liste a ne sont pas espacĂ©s, ni ceux permettant de dĂ©finir le vecteur d. Comme ça, on identifie plus facilement la structure de my.list2 dans le code.

8.5. Data.frame

Un data.frame est une liste avec un seul niveau hiĂ©rarchique, et dont tous les Ă©lĂ©ments sont de mĂȘme longueur (mĂȘme nombre de sous-Ă©lĂ©ments). Les Ă©lĂ©ments sont des vecteurs (donc les sous-Ă©lĂ©ments sont de mĂȘme mode), mais les diffĂ©rents Ă©lĂ©ments peuvent ĂȘtre de mode diffĂ©rents.
Les data.frames sont souvent utilisĂ©s pour reprĂ©senter des tableaux Excel : chaque colonne est un Ă©lĂ©ment (vecteur) du data.frame et les colonnes peuvent ĂȘtre de modes diffĂ©rents. Il est normal que les colonnes aient le mĂȘme nombre de lignes (et donc que les Ă©lĂ©ments aient la mĂȘme longueur).

Bien que les matrices et les data.frames se ressemblent, ces objets sont trÚs différents pour R. Une matrice est UN vecteur coupé en lignes et colonnes. Un data.frame est une liste de vecteurs, présentés en colonnes.

Les opĂ©rations sont en gĂ©nĂ©ral plus rapides sur les matrices. Donc si vous avez des gros jeux de donnĂ©es, essayez d’utiliser des matrices plutĂŽt que des data.frames.

Exemple :
my.df <- data.frame(num=1:3, let=c("a","b","c"))
my.df

  num let
1   1   a
2   2   b
3   3   c

Les lignes sont numérotées si elles ne sont pas nommées. Attention à ne pas confondre les numéros de lignes avec les valeurs de la premiÚre colonne (num).

mode(my.df)

[1] "list"

Les data.frames sont également de mode liste, ce qui est normal.

class(my.df)

[1] "data.frame"

8.6. Facteur

Les facteurs ressemblent plus à un mode, mais pour R, c’est une classe.

Un facteur est un vecteur de caractĂšre codĂ© en numĂ©rique. Un facteur est en fait composĂ© d’un vecteur d’entiers, oĂč chaque entier est associĂ© Ă  un attribut (‘label’).

Dit autrement, les facteurs sont les variables catĂ©gorielles discrĂštes utilisĂ©es en statistique, par exemple sexe (valeurs = homme ou femme), couleur des yeux (valeurs = bleu, marron, vert
), etc. Chaque valeur (appelĂ©e ‘level’) est associĂ©e Ă  un entier (de 1 au nombre de valeurs distinctes).

Certains logiciels ont besoin de crĂ©er des ‘dummy variables’ pour traiter ce genre de donnĂ©es. R traite ces variables discrĂštes facilement avec les facteurs, que ce soit pour les statistiques ou les graphiques. Cela accĂ©lĂšre les opĂ©rations Ă©galement.

Par defaut, lorsque vous créez un data.frame, les colonnes de caractÚres sont transformées en facteur.

Exemples :
my.fac <- factor(c("homme","femme","femme","homme"))
my.fac

[1] homme femme femme homme
Levels: femme homme

mode(my.fac)

[1] "numeric"

Remarquez que les valeurs sont de mode numérique (ce qui explique pourquoi elles ne sont pas entre guillemets).

class(my.fac)

[1] "factor"

levels(my.fac)

[1] "femme" "homme"

Les levels sont par défaut par ordre alphabétique.

as.numeric(my.fac)

[1] 2 1 1 2

Lorsqu’on convertit un facteur en numĂ©rique, on voit la reprĂ©sentation numĂ©rique des facteurs.

8.7. Dates

R peut bien sĂ»r gĂ©rer les dates. Les dates sont en fait une valeur numĂ©rique calculĂ©e en nombres de jours Ă  partir d’une origine prĂ©dĂ©finie. Cette origine n’est pas la mĂȘme sous R et sous Excel selon le systĂšme d’exploitation, ce qui pose parfois des problĂšmes.
Il existe de nombreuses fonctions et packages spĂ©cifiques pour manipuler les dates, mais nous n’entrerons pas dans le dĂ©tail ici.

Exemples :
dat <- as.Date("27-07-2016", format="%d-%m-%Y")
dat

[1] "2016-07-27"

mode(dat)

[1] "numeric"

class(dat)

[1] "Date"

9. Manipuler des objets

C’est ici que vous allez commencer à travailler !

Cette section concerne la manipulation d’objets, et notamment comment en extraire une partie. C’est important car vous ne travaillerez pas forcĂ©ment sur toutes les colonnes/lignes d’un tableau et il faudra savoir comment sĂ©lectionner celles qui vous intĂ©ressent.

Cette section est sĂ©parĂ©e par classe d’objet car chaque classe se comporte diffĂ©remment. Il est donc essentiel de savoir reconnaitre la classe d’un objet. Le mode importe peu par contre.

Vous devriez avoir suffisamment d’exemples et d’exercices dans ce document pour apprendre Ă  manipuler tous les objets. Il est possible que vous ayez besoin de plus de temps, alors n’hĂ©sitez pas Ă  rĂ©essayer aprĂšs ce didacticiel. Il est important que vous soyez Ă  l’aise avec ces aspects avant d’aller plus loin.

9.1. Vecteurs

Ces manipulations concernent les vecteurs de n’importe quel mode, mais Ă©galement les vecteurs de dates et facteurs.

CrĂ©ez deux vecteurs en utilisant la fonction : (pour l’aide, taper ?":"), (1) un vecteur x contenant des entiers de 1 Ă  50, et (2) y contenant des entiers de 50 Ă  1. Affichez-les dans la console. À votre avis, Ă  quoi correspondent les nombres entre crochets ?

Réponse :

x <- 1:50
x
y <- 50:1
y

Les nombres entre crochets indiquent la position dans le vecteur de l’élĂ©ment affichĂ© juste aprĂšs. Dans le cas de x, [16] indique que l’élĂ©ment affichĂ© juste Ă  droite (donc le nombre 16) est le 16Ăš Ă©lĂ©ment du vecteur x. C’est inutile dans ce cas, mais dans le cas de y, le 16Ăš Ă©lĂ©ment est le nombre 35, ce qui est moins Ă©vident. On parle d’indice. Ces indices sont au dĂ©but de chaque ligne.
Selon la largeur de votre console, les lignes seront plus ou moins longues, et donc les indices ne s’afficheront pas aux mĂȘmes positions.

En sachant cela, d’aprĂšs vous, comment extrait-on un Ă©lĂ©ment d’un vecteur, par exemple l’élĂ©ment n°47 de x puis de y ?

Réponse :

x[47]
y[47]

Le simple crochet permet d’extraire un ou plusieurs Ă©lĂ©ments d’un vecteur. MĂȘme si on ne dirait pas, le crochet est en fait une fonction (tapez ?"[" pour afficher l’aide).

Utilisation : tapez le nom de l’objet que vous souhaitez sĂ©lectionner suivi de crochets. Entre les crochets, indiquez un vecteur d’indices (ou de noms, voir plus bas).

Exercices :

  • Extraire les Ă©lĂ©ments n°44 Ă  47 de x et y
  • Extraire les Ă©lĂ©ments n°44, 46 et 48 de x et y
  • Extraire tous les Ă©lĂ©ments de x et y, sauf l’élĂ©ment n°45 (les indices nĂ©gatifs sont exclus de l’extraction)
  • Extraire tous les Ă©lĂ©ments de x et y, sauf les Ă©lĂ©ments n°1 et 45
  • Extraire tous les Ă©lĂ©ments de x et y, sauf les Ă©lĂ©ments n°1 Ă  3
  • Calculer la moyenne des 45 premiers Ă©lĂ©ments de x et y
  • Calculer la moyenne de x et y sans tenir compte de l’élĂ©ment n°8
  • Il est possible de donner des noms aux valeurs et d’utiliser ces noms plutĂŽt que des indices.
    Commencez par afficher x et sa structure pour voir l’état initial : x, str(x)
    Donnez des noms pour chaque Ă©lĂ©ment de x (il n’est pas possible de donner des noms Ă  certains Ă©lĂ©ments seulement) : names(x) <- paste("n", 1:50, sep=""). La fonction names() permet d’afficher ou modifier les noms des Ă©lĂ©ments des objets et la fonction paste() permet de coller des caractĂšres.
    Regardez le résultat : x, str(x)
    Extraire la valeur dont le nom est ‘n5’ de x.
    Extraire les valeurs dont les noms sont ‘n5’, ‘n6’ et ‘n7’.

Réponses :

x[44:47]
y[44:47]

x[c(44,46,48)]
y[c(44,46,48)]

x[-45]
y[-45]

x[-c(1,45)]
y[-c(1,45)]

x[-(1:3)]
y[-(1:3)]

mean(x[1:45])
mean(y[1:45])

mean(x[-8])
mean(y[-8])

x
str(x)
names(x) <- paste("n", 1:50, sep="")
x
str(x)
x['n5']
x["n5"]
x[c("n5", "n6", "n7")] #Il n'est bien sûr pas possible d'utiliser la fonction ":" pour créer une suite de caractÚres

9.2. Matrices et arrays

Créez une matrice mat contenant les entiers de 1 à 10 avec 5 lignes et 2 colonnes en utilisant la fonction matrix(), puis affichez-la dans la console.

Grñce à l’output, essayer de comprendre comment extraire les valeurs d’une matrice.

Réponse :

mat <- matrix(1:10, nrow=5, ncol=2)
mat

Le simple crochet permet d’extraire des lignes/colonnes d’une matrice.

Utilisation : tapez le nom de l’objet que vous souhaitez sĂ©lectionner suivi de crochets. Entre les crochets, commencez par mettre une virgule (sinon vous risquez de l’oublier ; si si, ça arrive, souvent mĂȘme !). Avant la virgule, entrez un vecteur d’indices pour les lignes ; aprĂšs la virgule, un vecteur d’indices pour les colonnes. Si vous voulez sĂ©lectionner toutes les lignes/colonnes, ne rien entrer dans la partie correspondante avant/aprĂšs la virgule.

Exercices :

  • Extraire la valeur de la 2Ăš ligne et 1Ăš colonne de mat.
  • Extraire toute la 2Ăš ligne de mat, autrement dit, toutes les colonnes de la 2Ăš ligne. Observez la structure de l’output.
  • Extraire toute la 1Ăš colonne de mat, autrement dit, toutes les lignes de la 1Ăš colonne. Observez la structure de l’output.
  • Extraire les lignes 2 et 3 et la colonne 1 de mat. Observez la structure de l’output.
  • Extraire les lignes 2 et 3 et les colonnes 1 et 2 de mat. Observez la structure de l’output.
  • Extraire les toutes les lignes sauf la 2Ăš, et la 1Ăšre colonne de mat. Observez la structure de l’output.
  • Extraire les lignes 1 et 3 et la 1Ăšre colonne de mat. Observez la structure de l’output.
  • Nommer les lignes et les colonnes de mat : dimnames(mat) <- list(paste("row",1:5,sep=""), paste("col",1:2,sep="")). Les noms (dimnames()) sont modifiĂ©es par une liste contenant deux Ă©lĂ©ments : un vecteur de caractĂšres pour les lignes et un autre pour les colonnes.
    Extraire les lignes nommĂ©es “row1” et “row3” de mat.
  • CrĂ©er un vecteur nommĂ© z composĂ© de deux valeurs : (1) la valeur de la 2Ăš ligne et 1Ăš colonne de mat, et (2) la valeur de la 3Ăš ligne et 2Ăš colonne de mat.
  • CrĂ©er une matrice nommĂ©e mat2 Ă  2 lignes et 2 colonnes composĂ©e des valeurs (1) des deux premiĂšres lignes et de la 1Ăš colonne de mat, et (2) des lignes 3 et 4 et de la colonne 2 de mat.

Réponses :

mat[2,1]

mat[2,]
str(mat[2,]) #un vecteur d'entiers

mat[,1]
str(mat[,1]) #un vecteur d'entiers

mat[2:3,1]
str(mat[2:3,1]) #un vecteur d'entiers

mat[2:3,1:2]
mat[2:3,]
str(mat[2:3,]) #une matrice d'entiers (les 2 dimensions apparaissent dans les crochets aprĂšs 'int')

mat[-2,1]
str(mat[-2,1]) #un vecteur d'entiers

mat[c(1,3), 1]
str(mat[c(1,3), 1]) #un vecteur d'entiers

dimnames(mat) <- list(paste("row",1:5,sep=""), paste("col",1:2,sep=""))
mat[c("row1","row3"),]
str(mat[c("row1","row3"),]) #une matrice d'entiers

z <- c(mat[2,1], mat[3,2])
z

mat2 <- matrix(c(mat[1:2,1], mat[3:4,2]), nrow=2, ncol=2)
mat2

Si possible (1 seule colonne/ligne), les dimensions seront supprimĂ©es et l’output sera un vecteur.

Créez un array arr contenant les entiers de 1 à 20 avec 5 lignes, 2 colonnes et 2 niveaux dans la 3Ú dimension, en utilisant la fonction array(), puis affichez-la dans la console.

Réponse :

arr <- array(1:20, dim=c(5,2,2))
arr

Extraire la 3Ăš ligne, 1Ăš colonne et 2Ăš niveau de la 3Ăš dim de arr.

Réponse :

arr[3,1,2]

Le principe est le mĂȘme qu’avec les matrices, mais avec plus de virgules pour sĂ©parer les indices pour chaque dimension.

9.3. Listes

CrĂ©ez une liste mylist composĂ©e de 3 Ă©lĂ©ments : (1) une liste composĂ©e d’un vecteur d’entiers 1 Ă  3 et d’un vecteur de caractĂšres a et b, (2) la matrice mat, et (3) un vecteur composĂ© des valeurs 4, 5, 6d et 7. Utilisez la fonction list().
Affichez la liste et sa structure.

Grñce à l’output, essayer de comprendre comment extraire les valeurs d’une liste.

Réponse :

mylist <- list(list(1:3,c("a","b")), mat, c(4,5,"6d",7))
mylist
str(mylist) #Notez la structure hiérarchique

Le simple crochet permet d’extraire une liste contenant les Ă©lĂ©ments d’une liste. Le double crochet permet d’extraire un Ă©lĂ©ment d’une liste.

Utilisation : tapez le nom de l’objet que vous souhaitez sĂ©lectionner suivi de crochets. Entre les doubles crochets, entrez l’indice de l’élĂ©ment que vous voulez extraire. Il n’est pas possible de sĂ©lectionner plusieurs Ă©lĂ©ments en mĂȘme temps avec le double crochet. Pour sĂ©lectionner plusieurs Ă©lĂ©ments, il faut que l’output soit une liste ; il faut donc utiliser le simple crochet.

Exercices :

  • Extraire le 1er Ă©lĂ©ment de mylist.
  • Extraire une liste contenant le 1er Ă©lĂ©ment de mylist.
  • Extraire une liste contenant les 1er et 3Ăš Ă©lĂ©ments de mylist.
  • Extraire le 1er Ă©lĂ©ment du 1er Ă©lĂ©ment de mylist.
  • Extraire le 1er Ă©lĂ©ment du 1er Ă©lĂ©ment du 1er Ă©lĂ©ment de mylist.
  • Extraire la 1Ăš colonne du 2Ăš Ă©lĂ©ment de mylist.
  • Extraire la 3Ăš ligne du 2Ăš Ă©lĂ©ment de mylist.
  • Extraire le 3Ăš Ă©lĂ©ment du 3Ăš Ă©lĂ©ment de mylist.
  • CrĂ©er un vecteur w comprenant 2 Ă©lĂ©ments : (1) la 2Ăš ligne et la 1Ăš colonne du 2Ăš Ă©lĂ©ment de mylist, et (2) le 2Ăš Ă©lĂ©ment du 1er Ă©lĂ©ment du 1er Ă©lĂ©ment de mylist.
  • Nommer les 3 Ă©lĂ©ments de mylist, ainsi que les 2 Ă©lĂ©ments du 1er Ă©lĂ©ment de mylist : names(mylist) <- c("List1","MAT","VEC") et names(mylist[[1]]) <- c("L1vec1","L1vec2")
    Extraire l’élĂ©ment nommĂ© MAT de mylist.
    Extraire l’élĂ©ment nommĂ© vec1 de mylist.

Réponses :

mylist[[1]]
mylist[1]
mylist[c(1,3)]

mylist[[1]][[1]]
mylist[[1]][[1]][1]

mylist[[2]][,1]
mylist[[2]][3,]

mylist[[3]][3]

w <- c(mylist[[2]][2,1], mylist[[1]][[1]][2])

names(mylist) <- c("L1","MAT","VEC")
names(mylist[[1]]) <- c("vec1","vec2")
mylist
mylist[["MAT"]]
mylist[["L1"]][["vec1"]]

Les listes sont hiĂ©rarchiques et peuvent contenir toutes les classes d’objets. Pour savoir comment extraire un Ă©lĂ©ment d’une liste, il faut donc savoir de quelle classe est cet Ă©lĂ©ment. Et ainsi de suite dans la structure. La mĂ©thode utilisĂ©e dĂ©pendra de la classe comme on l’a vu prĂ©cĂ©demment.

Le symbole $ peut remplacer le double crochet dans une liste nommĂ©e. Il est alors possible d’utiliser les noms d’élĂ©ments sans guillemets. Ne pensez pas que cette mĂ©thode est mieux. Elle est peu utilisĂ©e pour crĂ©er des scripts/fonctions applicables Ă  de nombreuses situations.
Exemples :
mylist$MAT

     col1 col2
row1    1    6
row2    2    7
row3    3    8
row4    4    9
row5    5   10

mylist$L1$vec1

[1] 1 2 3

9.4. Data.frames

9.4.1. Extraction simple

CrĂ©er un data.frame mydf contenant 3 colonnes et 10 lignes (dont les noms seront “r1”, “r2”, 
, “r10”) avec la fonction data.frame() : (1) colonne A avec les entiers de 1 Ă  10, (2) colonne B contenant 10 valeurs alĂ©atoires issues d’une distribution normale (utiliser la fonction rnorm()), et (3) colonne D contenant 5 “e” puis 5 “f” (la fonction rep(..., each=5) peut ĂȘtre utile). Affichez-le, ainsi que sa structure.

Réponse :

mydf <- data.frame(A=1:10, B=rnorm(10), D=rep(c("e","f"),each=5), row.names=paste("r",1:10,sep=""))
mydf
str(mydf)

Pour extaire des valeurs Ă  partir d’un data.frame, la notation liste est bien sĂ»r applicable puisque les data.frames sont des listes particuliĂšres. Mais il est Ă©galement possible d’utiliser la notation matrice, plus flexible et plus intuitive.

Exercices :

  • Extraire la 2Ăš colonne de mydf de 4 façons diffĂ©rentes.
  • Extraires les lignes 2-3 de la colonne 2 de 3 façons diffĂ©rentes.

Réponses :

mydf[[2]]   #notation liste
mydf[,2]    #notation matrice
mydf[["B"]] #notation liste nommée
mydf[,"B"]  #notation matrice nommée
mydf$B      #notation $

mydf[[2]][2:3]            #notation liste
mydf[2:3,2]               #notation matrice
mydf[c("r2","r3"), "B"]   #notation matrice nommée
9.4.2. Extraction en fonction des valeurs dans une ou plusieurs colonnes/lignes

Il est souvent intĂ©ressant d’extraire des lignes d’un data.frame en se basant sur les valeurs d’une colonne.
Par exemple, extraire les lignes qui contiennent “e” dans la colonne “D”.
La logique n’est pas intuitive, mais ce n’est pas trĂšs compliquĂ©. En dĂ©composant, cela donne : (1) dans mydf, (2) sĂ©lectionner (3) les lignes dont (4) les valeurs sont Ă©gales Ă  (5) “e” dans (6) la colonne “D” de “mydf”.
Donc :
(1) mydf
(2) mydf[,]
(3) mydf[lignes,]
(4) mydf[lignes==valeur,] L’égalitĂ© est testĂ© par le symbole ==, pour diffĂ©rencier du simple = des arguments
(5) mydf[lignes=="e",]
(6) mydf[mydf$D=="e",] Il est bien sĂ»r possible de remplacer mydf$D par d’autres notations (mydf[[3]], mydf[['D']]).

   A          B D
r1 1 -1.5795649 e
r2 2  0.2555095 e
r3 3  0.6227635 e
r4 4  0.5079373 e
r5 5 -0.4499038 e

Pour extraire les lignes dont les valeurs de la colonne “D” ne contiennent pas “e”, utiliser le symbole diffĂ©rent != :
mydf[mydf$D!="e",]

     A          B D
r6   6 -0.1049976 f
r7   7 -0.7879905 f
r8   8 -1.7092761 f
r9   9 -0.6359420 f
r10 10  0.9078611 f

Pour extraire plusieurs valeurs, il faut alors utiliser le symbole %in% plutĂŽt que ==. Exemples :
mydf[mydf$A %in% c(1,3,5), ]

   A          B D
r1 1 -1.5795649 e
r3 3  0.6227635 e
r5 5 -0.4499038 e

mydf[row.names(mydf) %in% c("r1","r10"), ]

     A          B D
r1   1 -1.5795649 e
r10 10  0.9078611 f

Pour extraire en fonction des valeurs de plusieurs colonnes, il faut utiliser les opérateur bouléen ET (&, toutes les conditions sont respectées) et OU (|, au moins une condition est respectée) :
mydf[mydf$D=="e" & mydf$A %in% c(1,3,5), ]

   A          B D
r1 1 -1.5795649 e
r3 3  0.6227635 e
r5 5 -0.4499038 e

mydf[mydf$D=="e" | mydf$A %in% c(8,10), ]

     A          B D
r1   1 -1.5795649 e
r2   2  0.2555095 e
r3   3  0.6227635 e
r4   4  0.5079373 e
r5   5 -0.4499038 e
r8   8 -1.7092761 f
r10 10  0.9078611 f

Ces manipulations fonctionnent bien sĂ»r de la mĂȘme façon sur les colonnes (aprĂšs la virgule entre les simples crochets).

9.4.3. Ajouter des colonnes et effectuer des opérations mathématiques sur les colonnes

Pour ajouter une colonne Ă  mydf, il suffit d’assigner un vecteur Ă  une colonne supplĂ©mentaire :
mydf[[4]] <- rnorm(10)

     A          B D           V4
r1   1 -1.5795649 e  0.341965486
r2   2  0.2555095 e  0.201031513
r3   3  0.6227635 e  0.556581860
r4   4  0.5079373 e -0.631212107
r5   5 -0.4499038 e  0.242101746
r6   6 -0.1049976 f -2.391774075
r7   7 -0.7879905 f -0.378202382
r8   8 -1.7092761 f  1.035118856
r9   9 -0.6359420 f  0.249394439
r10 10  0.9078611 f  0.006269643

Il est aussi possible de créer directement une colonne nommée :
mydf[["E"]] <- rnorm(10)

     A          B D           V4           E
r1   1 -1.5795649 e  0.341965486 -1.05802984
r2   2  0.2555095 e  0.201031513 -0.64906076
r3   3  0.6227635 e  0.556581860 -0.57553261
r4   4  0.5079373 e -0.631212107 -1.06903209
r5   5 -0.4499038 e  0.242101746  0.04868978
r6   6 -0.1049976 f -2.391774075  3.79143329
r7   7 -0.7879905 f -0.378202382 -0.73228296
r8   8 -1.7092761 f  1.035118856 -0.37971712
r9   9 -0.6359420 f  0.249394439  1.58841958
r10 10  0.9078611 f  0.006269643  1.08405468

Il faut bien sĂ»r que le vecteur contiennent un nombre d’élĂ©ments Ă©gal au nombre de lignes du data.frame.

Pour ajouter une colonne à mydf qui correspond à la différence des colonnes 1 et 2, il suffit de faire :
mydf[[6]] <- mydf[[1]] - mydf[[2]]

     A          B D           V4           E       V6
r1   1 -1.5795649 e  0.341965486 -1.05802984 2.579565
r2   2  0.2555095 e  0.201031513 -0.64906076 1.744490
r3   3  0.6227635 e  0.556581860 -0.57553261 2.377237
r4   4  0.5079373 e -0.631212107 -1.06903209 3.492063
r5   5 -0.4499038 e  0.242101746  0.04868978 5.449904
r6   6 -0.1049976 f -2.391774075  3.79143329 6.104998
r7   7 -0.7879905 f -0.378202382 -0.73228296 7.787991
r8   8 -1.7092761 f  1.035118856 -0.37971712 9.709276
r9   9 -0.6359420 f  0.249394439  1.58841958 9.635942
r10 10  0.9078611 f  0.006269643  1.08405468 9.092139

R réalisera la soustraction ligne par ligne.
Il est ici aussi possible de nommer la colonne directement lors de sa création comme montré ci-dessus.

Les notations sont interchangeables ($, [[indice]], [["nom"]]).

Les exercices prĂ©cĂ©dents devraient vous permettre d’utiliser les diffĂ©rentes notations pour extraire des donnĂ©es d’un data.frame. Mais je vous conseille de crĂ©er de nouveaux data.frames et d’en extraire diffĂ©rentes parties de diffĂ©rentes façons pour bien ĂȘtre Ă  l’aise.


10. SynthĂšse

10.1. Modes, classes, objets de données, fonctions et arguments

Il est important de pouvoir identifier facilement les modes et les classes, ainsi que de différencier entre les objets de données, les fonctions et les arguments, pour pouvoir utiliser R.

Voici un résumé :

  • Modes : si l’output est entre guillemets, c’est du caractĂšre. Sinon, si c’est des nombres, alors c’est numĂ©rique ; si c’est TRUE/FALSE, alors c’est logique. Facile non ? En cas de doute, la fonction mode() peut ĂȘtre utile.
  • Classes : l’output permet de diffĂ©rencier les classes. Reprenez les exemples ci-dessus au besoin. Les fonctions class() et surtout str() sont trĂšs utiles.
  • Objets de donnĂ©es : leurs noms sont des suites de caractĂšres sans guillemets, et ils contiennent des donnĂ©es.
  • Fonctions : ce sont aussi des objets, mais particuliers. Si vous tapez le nom d’une fonction, vous verrez les opĂ©rations que cette fonction effectue :
    mean
    Mais en général, vous voulez exéctuer les opérations de la fonction. Dans ce cas, il faut utiliser les parenthÚses pour grouper et définir les arguments :
    mean(1:10)
    Les parenthĂšses sont donc essentielles pour reconnaitre les fonctions.

  • Arguments : les arguments sont les options de la fonction. Ils sont tous entre les parenthĂšses de la fonction, sĂ©parĂ©s par des virgules, et le symbole = permet d’assigner des valeurs aux arguments. Ils peuvent ĂȘtre nommĂ©s ou utilisĂ©s dans l’ordre dĂ©fini par la fonction.

Les virgules n’ont donc qu’une seule utilitĂ© dans R : sĂ©parer les arguments d’une fonction ([ et [[ sont en fait des fonctions).
Et je vous conseille encore de ne garder le = que pour les arguments ; préférez <- pour assigner (cf. 6.2 et 7.4).

10.2. ParenthĂšses, crochets, accolades

L’usage de chaque type est spĂ©cifique. Il est important de bien les diffĂ©rencier.

  • ParenthĂšses : elles englobent l’appel Ă  la fonction, et donc les arguments. Parfois aucun argument n’est nĂ©cessaire ; il ne faut malgrĂ© tout pas oublier les parenthĂšses ! Donc fonction = parenthĂšses et vice-versa !
  • Crochets : ils permettent d’extraire une partie d’un objet. Pour accĂ©der Ă  l’aide, tapez ?"[" dans la console. Donc extraire = crochets et vice-versa !
  • Accolades : elles regroupent plusieurs commandes, notamment pour crĂ©er des fonctions et des constructions de type if... else.... Nous n’en avons pas parlĂ©, mais vous en aurez forcĂ©ment besoin un jour sous R.

11. Packages

Pour utiliser les fonctions disponibles dans un package, il faut commencer par installer ce dernier. Vous pouvez aller dans les menus, ou taper install.packages("nom du package") dans la console.
Il faut également réguliÚrement mettre à jour les packages installés, soit en utilisant les menus, soit avec update.packages().

Mais l’installation ne suffit pas pour utiliser les fonctions du package. Il faut ensuite charger ce dernier dans l’espace de travail, en tapant library(nom du package) dans la console (avec ou sans guillemets pour le nom du package).

Une erreur fréquente dans R est : Error: could not find function 'name of function'. Il y a deux possibilités :

  • Vous avez mal tapĂ© le nom de la fonction (n’oubliez pas que R diffĂ©rencie les majuscules et minuscules)
  • Vous n’avez pas chargĂ© le package contenant cette fonction

12. Comment trouver une fonction ?

Maintenant que vous savez manipuler les objets sous R, vous devriez ĂȘtre capable de transformer un objet pour pouvoir appliquer une fonction dessus. Donc tout ce qu’il vous manque, c’est du vocabulaire.

Voici certaines façons de trouver une fonction pour effectuer une tùche particuliÚre :

  • La fonction apropos() permet de trouver une fonction disponible (c’est-Ă -dire contenue dans un package chargĂ©) Ă  partir d’une partie de son nom. Essayez par exemple apropos("read"). Cette fonction n’est pas sensible Ă  la casse.
  • Si vous savez dans quel package se trouve la fonction, mais que vous ne connaissez plus son nom, vous pouvez afficher l’aide d’un package : help(package="nom du package")
  • Si vous connaissez le nom de la fonction mais que vous ne savez plus dans quel package elle se trouve (et donc quel package charger) : ??fonction. Avec un point d’interrogation, R cherche l’aide d’une fonction chargĂ©e. Avec deux, R cherche l’aide d’une fonction installĂ©e. Avec 3, R retourne une erreur. Avec 4
 je vous laisse essayer !
  • La fonction RSiteSearch() permet de chercher sur une base de donnĂ©es de fonctions et vignettes
  • Rseek (http://rseek.org/) permet de lancer une recherche Google spĂ©cifique pour R
  • Crantastic (http://crantastic.org/) permet de trouver un package
  • Google est votre ami, qui reconnait correctement le terme “R” !
  • Enfin, pour l’aide relative Ă  R, il y a la liste (https://www.r-project.org/mail.html). Attention : prenez vraiment le temps de lire les instructions et le ‘posting guide’ (et surtout la partie pour savoir comment envoyer un exemple reproductible) avant d’envoyer un mail sur cette liste. Mais si vous faites ça correctement, vous ĂȘtes sĂ»r de trouver de l’aide.

Je vous joins également un aide mémoire des fonctions utiles par Mayeul Kauffmann.

N’oubliez pas que R ainsi que tout ce qui s’y rapporte est en Anglais !


13. Comprendre la page d’aide d’une fonction

Une page d’aide est toujours organisĂ©e de la mĂȘme façon. Prenons l’exemple de mean() :

  • nom de la fonction {package contenant la fonction}, ici mean {base} (‘base’ indiquant l’installation de base de R)
  • Description : ce que fait la fonction, ici calcule la moyenne arithmĂ©tique (tronquĂ©e)
  • Usage : la fonction, ses arguments, l’ordre des arguments et les valeurs par dĂ©faut des arguments. Certains arguments ont des valeurs par dĂ©faut (nom argument = valeur par dĂ©faut), tandis que d’autre n’ont pas de dĂ©faut (seul le nom de l’argument est donnĂ©) ; sans dĂ©faut, il est obligatoire de fournir une valeur lorsqu’on appelle la fonction.
    Dans notre exemple, l’argument x n’a pas de valeur par dĂ©faut, tandis que trim et na.rm en ont (0 et FALSE, respectivement) ; x est donc obligatoire. Si vous ne prĂ©cisez pas trim et na.rm, alors les valeurs par dĂ©faut seront utilisĂ©es.
    Il existe parfois plusieurs ‘mĂ©thodes’ en fonction de la classe de l’input.
  • Arguments : descriptif des arguments, leurs classes, modes, longueur, valeurs possibles, etc. C’est souvent compliquĂ©, mais c’est trĂšs important.
  • Value : ce que la fonction retourne (output). C’est Ă©galement trĂšs important pour comprendre dans quel objet (classe, mode, longueur
) il sera possible de stocker l’ouput de la fonction
  • References : oĂč la fonction a Ă©tĂ© dĂ©finie
  • See also : des fonctions similaires ou associĂ©es
  • Examples : quelques exemples montrant comment se servir de la fonction (honnĂȘtement, pas toujours bien faits)
  • Tout en bas, vous avez l’index des fonctions disponibles dans le package contenant la fonction (ici ‘base’), ce qui peut toujours ĂȘtre utile

14. OĂč trouver de la documentation ?

Il existe de nombreux livres, blogs, didacticiels
 En voici deux qui me semblent pertinents pour commencer :

Il ne faut pas non plus oublier que R permet d’effectuer de nombreux tests statistiques. Je vous invite donc Ă  vous plonger dans ce domaine Ă©galement !


15. Pour aller plus loin

Voici quelques pistes pour continuer votre apprentissage :

  • Importer un fichier texte/csv : read.table(), read.csv(), read.csv2(), file.choose()
  • Importer un fichier Excel : packages readxl et xlsx
  • Graphiques : plot(), boxplot(), par(), package ggplot2
  • Manipulation donnĂ©es : packages plyr et dplyr
  • Manipulation de caractĂšres : voir ?regex et fonctions citĂ©es
  • if/else, for, while
 : voir ?"if"
  • formules (graphiques, tests) : formula()
  • apply(), sapply(), lapply()

  • print(), cat()
  • is.na(), is.nan()
  • seq(), rep()
  • cbind(), rbind()
  • vector(), length(), which()

Si vous ĂȘtes arrivĂ© lĂ  en ayant tout compris, alors vous ne devriez plus avoir besoin de moi !
Sinon, tous les membres du groupe de R seront prĂȘts Ă  vous aider, n’hĂ©sitez pas Ă  nous contacter.