[1] 2.3 3.6 1.1 2.4 2.5 10.2
[1] "Paris" "Lyon" "Marseille"
[1] TRUE FALSE FALSE TRUE TRUE
2) Manipuler des objets avec R
ISIG, UMR 5600 EVS
2024-10-01
Nous avons vu dans la section précédente comment créer des objets très simples et comment les assigner à un environnement.
Il y a en fait une multitude de types d’objets possibles dans R. Ici nous allons aborder
On appelle vecteur toute séquence d’éléments de même type, par exemple:
v1=
2.3 3.6 1.1 2.4 2.5 10.2 5.1 2.0
v2=
"Paris" "Lyon" "Marseille" "Rennes" "Montpellier"
ou v3=
TRUE FALSE FALSE TRUE TRUE
On peut également créer des vecteurs correspondant à:
ou bien:
Les vecteurs peuvent être de classes différentes selon le type de valeurs qu’ils contiennent (par contre toutes les valeurs d’un vecteur sont supposées être d’un même type).
Ils peuvent par exemple être de mode
Il peut arriver que certaines valeurs d’un objet soient non renseignées. En R, ces valeurs s’écrivent NA
(pour not available).
Par exemple:
Les facteurs ressemblent généralement à des vecteurs de mode caractère, à la nuance près qu’ils comprennent généralement plusieurs niveaux, comme par exemple
[1] date1 date1 date1 date2 date2 date2
Levels: date1 date2
[1] "date1" "date2"
La nuance entre vecteurs et facteurs est importante pour un certain nombre de fonctions implémentées dans R, il est donc assez souvent nécessaire de convertir les vecteurs en facteurs et inversement.
Une liste est un assemblage d’objets qui peuvent être de natures et/ou de tailles différentes. Par exemple, la liste l1
$sites
[1] "Paris" "Lyon"
$nb
[1] 1100 332 52 532 33 66 22 114
rassemble un vecteur de taille 2 et un vecteur de taille 8 au sein d’un même objet.
En pratique, de nombreuses fonctions de R renvoient un objet de type liste (par exemple, un objet “régression linéaire”, renvoyé par la fonction lm, comprend entre autres choses un vecteur de coefficients de la régression et un vecteur de résidus de la régression (donc deux vecteurs de tailles différentes).
Comme une matrice, un tableau de données compte plusieurs lignes et colonnes. En revanche, les colonnes (ou variables) d’un tableau de données peuvent être de types différents, et sont nommées.
Voici comment créer un tableau de données (tibble) sous R, en assemblant plusieurs vecteurs de même taille:
t1 <- tibble::tibble(Espece = c("Chien","Dauphin",
"Chat","Eponge"),
Nom = c("Lassie","Flipper",
"Garfield","Bob"),
Date = c(1940,1964,1978,1999))
t1
Espece | Nom | Date |
---|---|---|
Chien | Lassie | 1940 |
Dauphin | Flipper | 1964 |
Chat | Garfield | 1978 |
Eponge | Bob | 1999 |
Remarque: les objets de type data.frame
sont comparables aux tibbles
, avec quelques différences notamment liées au typage des variables et à l’affichage.
Pour interroger R quant au type (vecteur, facteur, tableau, matrice, etc.) ou au mode (numérique, caractère, logique, etc.) d’un objet, on utilise les fonctions de type **is.___**.
Par exemple:
On peut convertir un objet d’un type ou mode à un autre en utilisant les fonctions de type as.______. Par exemple,
convertit le vecteur v6 en facteur pour créer v6f.
On peut s’intéresser à une partie d’un objet, par exemple un ou plusieurs éléments d’un vecteur ou d’un facteur.
Pour le i\(^{eme}\) élément d’une liste on utilise des double crochets, ou bien le nom de l’élément auquel on s’intéresse:
Pour la j\(^{eme}\) variable d’un tableau on utilise des double crochets, ou bien le nom de la variable à laquelle on s’intéresse:
! (négation), & (et logique), | (ou logique)
Ils permettent de vérifier si une proposition est vraie ou non.
Nous avons d’ores et déjà utilisé un certain nombre de fonctions, comme
Toutes les fonctions que nous avons utilisées jusqu’à présent sont définies sur le package de base de R.
Les fonctions sont des objets qui ont toutes un point commun: elles s’écrivent avec des parenthèses, dans lesquelles l’utilisateur précise la valeur des arguments si besoin est.
Les arguments peuvent être obligatoires (la fonction ne peut pas fonctionner si ces arguments ne sont pas fournis par l’utilisateur) ou au contraire optionnels. Par exemple, dans
[1] "Traitement Textuel R Analyse"
[1] "Traitement;Textuel;R;Analyse"
L’argument sep
est optionnel, avec une valeur par défaut qui correspond à ” ” (pour la fonction paste0() le séparateur par défaut est ““).
Le fichier d’aide associé à une fonction est toujours structuré de la même manière. Sans trop détailler, voici les parties qui me semblent les plus importantes…
Détails et References permettent en outre d’expliquer les détails de la méthode et éventuellement de citer la ou les publications associées à la méthode/fonction ou package.
Les packages sont des paquets de fonctions visant à réaliser des tâches un peu particulières. L’installation de base de R vous installe, par défaut, un certain nombre de packages (base
, methods
, stats
, graphics
, etc.)
Dans la suite de ce cours, nous serons amenés à utiliser le package dplyr qui sert à manipuler des tableaux de données.
Pour être en mesure d’utiliser les fonctions de ce package, il faut:
Vous pouvez également installer et charger les packages en passant par RStudio:
INSTALLATION
Pour télécharger les codes du package sur l’ordi
Pour utiliser un package, vous aurez besoin de l’installer sur votre ordinateur. Cette étape nécessite que vous téléchargiez l’ensemble des fichiers contenant le code du package sur votre ordi. De ce fait, c’est une étape qui nécessite que vous ayiez accès à internet… Par contre, vous n’avez besoin de réaliser cette installation une seule fois (tant que vous ne changez pas d’ordi, ou que vous n’avez pas besoin de mettre à jour le package par exemple).
CHARGEMENT
Pour pouvoir appeler les fonctions en utilisant leur nom
A chaque fois (ou presque) que vous utiliserez un package (i.e. pour chacune de vos sessions de travail avec ce package), vous aurez besoin de le charger. Le chargement d’un package permet en effet à R d’ajouter les noms de ses fonctions à son “répertoire” et donc d’aller chercher le code correspondant où il se doit.
L’utilisateur de R peut créer lui-même ses fonctions, par exemple s’il pense répéter plusieurs fois un même type de traitement.
Imaginons par exemple que je veux réaliser la même régression linéaire, mais portant sur 3 jeux de données distincts data1, data2, data3.
Voilà comment je vais m’y prendre (en gros, je copie-colle deux fois mes deux premières lignes de code en remplaçant à chaque endroit “variant” ce qui doit l’être (ici lmX, dataX, sX):
D’ailleurs, ouhlala, oups, je me suis trompée en mettant data2 au lieu de data3… Eh oui parce que les copier-coller + modifs c’est non seulement pénible à faire mais en plus on risque des oublis ou des coquilles…
A la place, je peux définir une fonction:
Ainsi, pour schématiser ce principe, il s’agit en fait d’identifier ce qui dans le code est commun au différentes itérations (ici en gris) et les éléments qui varient d’une fois à l’autre (en jaune bleu rose à gauche) et qui vont correspondre à l’argument (ou aux différents arguments) de la fonction à droite (en orange).
Typiquement, on recommande de créer une fonction (au lieu d’écrire plusieurs fois des lignes de code identiques à un ou deux détails près) dès que l’on souhaite réaliser au moins 3 opérations similaires.
Une fonction s’écrit de la manière suivante:
On définit ainsi plusieurs choses:
mafonction
)argument1
, argument2
)return()
Voilà comment on peut voir une fonction…
Ici je considère une fonction .f()
qui a un input principal x
et des inputs secondaires (...
).
Classiquement, on va produire l’output en appelant la fonction avec pour arguments l’input x
et les inputs secondaires: output=.f(x,...)
.
Par exemple:
Ici, j’ai produit l’output moyenne
en appelant la fonction mean()
, avec pour argument principal x
et pour argument secondaire na.rm=TRUE
.
Ainsi, en utilisant map()
, j’ai en quelque sorte transformé ma petite fonction/usine mean()
(ci-dessus) en lui adjoignant une “rampe d’approvisionnement” (à droite):
Mon argument principal, x
, devient ainsi une liste d’éléments utilisés comme input pour la fonction mean()
. Mon argument secondaire, na.rm=TRUE
, est en revanche le même pour toutes les itérations.
L’output moyennes
est par défaut également une liste.
Imaginons maintenant que je souhaite appeler la fonction mean()
de manière répétée sur plusieurs éléments d’une liste:
Notez que l’on aurait pu ici demander explicitement à ce que le résultat nous soit renvoyé non pas comme une liste, mais comme un vecteur de valeurs numériques de type “double”:
Selon le type d’output renvoyé par la fonction, il peut ainsi être assez pratique d’utiliser les fonctions
map_dbl()
(double)map_lgl
(logique)map_int()
(entier)