R n'est pas limité à des variables de type numérique. L'instruction typeof(x) permet de connaître le type ou mode de l'objet x. Énumérons maintenant les principaux types de données.
Parmi les objets de type numérique, on distingue deux types: les entiers (integer) et les réels (real ou double). Définissons deux variables et vérifions leur type :
var.a <- 1.7
typeof(var.a)
var.b <- -3
typeof(var.b)
Les variables var.a et var.b sont du type double. Afin d'obtenir une variable de type integer, il faut forcer le type en utilisant la fonction as.integer. L'intérêt du type integer est que son stockage prend moins de place en mémoire.
var.c <- as.integer(var.b)
typeof(var.c)
R sait répondre à certaines questions simples, pas avec "oui" ou "non", mais avec TRUE ou FALSE. Voici quelques exemples:
# égalité des valeurs de var.a et var.b ?
var.a==var.b
# var.a plus grand que var.b ?
var.a>var.b
Ces réponses sont des objets de type logique. Le type logique ne peut prendre que les valeurs TRUE et FALSE (il n'y a pas de valeur du genre "je n'ai sais pas" ou "je m'en fous"). On appelle les questions des exemples ci-dessus des conditions logiques, car le résultat est de type logique.
De même, le résultat renvoyé par des fonctions qui testent le type d'un objet x (commençant par is.) est de type logique :
is.numeric(var.b)
is.integer(var.b)
var.x <- FALSE
is.logical(var.x)
TRUE et FALSE peuvent être saisis de manière plus succincte en tapant respectivement T et F.
Lorsque cela se révèle nécessaire, ce type de données est naturellement converti en type numérique sans qu'il y ait à le spécifier : TRUE vaut 1 et FALSE vaut 0. Cela est illustré par les exemples suivant:
TRUE + FALSE
TRUE/2 - var.b
(TRUE + T)^2 + FALSE*F + T*FALSE + F
Toute information mise entre guillemets (simple ' ou double ") correspond à une chaîne de caractères :
string1 <- "I love maths"
string1
typeof(string1)
string2 <- 'Moi aussi !'
string2
is.character(string2)
Les conversions de type sont possibles grâce aux fonctions commençant par as.
Il faut cependant être prudent quant à la signification de ces conversions. R retourne toujours un résultat à une instruction de conversion même si cette dernière n'a pas de sens. Voici quelques exemples:
# Conversion vers une chaîne de caractères
as.character(2.3)
# Conversion depuis une chaîne de caractères
string3 <- "2.3"
as.numeric(string3)
# Conversion depuis une chaîne de caractères
as.integer(string3)
# Conversion impossible
as.integer(string1)
R offre la possibilité d'organiser les différents types de données définies précédemment. En statistique nous travaillons beaucoup avec des vecteurs et des tableaux (dataframes) présentés ici. Les listes seront traitées ultérieurement.
Cette structure de données est la plus simple. Elle représente une suite de données de même type. Nous avons déjà vu les vecteurs de type numérique, mais il y a également des vecteurs de type logique ou de type chaîne de caractère :
vec.num <- c(1,4,9,2,0)
vec.num
vec.char <- c("R","c'est","trop","facile","!")
vec.char
Un vecteur de type logique peut être obtenu par une condition logique appliquée à un ou plusieurs vecteurs (de type numérique ou chaîne de caractère). Exemple :
vec.logique <- (vec.num>=4)
vec.logique
Dans cet exemple les éléments du vecteur vec.num sont comparé un à un à la valeur 4 et le résultat est reporté dans le vecteur vec.logique.
Dans l'exemple suivant, une comparaison élément par élément de deux vecteurs est effectuée :
vec.char2 <- c("R","c'est pas","mon","truc","!")
vec.char2
vec.logique2 <- (vec.char == vec.char2)
vec.logique2
Par définition, tous les éléments d'un vecteur sont de même type. Lorsqu'on mélange des données de types différents lors de la création d'un vecteur, R se charge alors d'opérer une conversion implicite vers le type de donnée le plus général comme vous pouvez le constater dans les exemples ci-dessous.
c(3,TRUE,7)
c(3,T,"7")
2:5
.5:4
12:-4
seq(2,6)
seq(2,6,by=.2)
seq(2,6,length=4)
rep(1,5)
rep(1:3,times=4)
rep(1:3,each=4)
Attention : Pour que les commandes de cette partie s'exécutent correctement, il faut enregistrer les fichiers Monfichier.txt, Monfichier2.txt et Monfichier3.txt dans le même dossier où ce notebook est enregistré.
Le tableau ou dataframe est l'objet de référence en statistique, car il permet de gérer les observations de plusieurs variables sur une collection d'individus. Conceptuellement, c'est une matrice dont les lignes correspondent aux individus et les colonnes aux variables (ou caractères) mesurées sur ces derniers. Chaque colonne représente une variable particulière dont tous les éléments sont du même type, mais chaque colonne peut avoir un type différent.
On peut créer un tableau de données en utilisant la fonction data.frame, mais le plus souvent on obtient un tableau comme résultat d'une importation de données. En pratique, les données d'une expérience statistique sont généralement enregistrées dans un fichier ASCII (fichier .txt) sous forme de tableau en utilisant un logiciel comme Excel. R permet de lire des fichiers externes pour les analyser par la suite.
Considérons le fichier MonFichier.txt qui contient le tableau de données suivant :
La fonction read.table permet de lire et d'importer sous R les données. Si le fichier Monfichier.txt est enregistré dans le répertoire de travail, l'importation des données sous R se fait par l'instruction
MesDonnees <- read.table(file= "MonFichier.txt")
Il est indispensable de mettre le nom du fichier entre guillemets " (ou entre apostrophes ') pour indiquer à R qu'il s'agit d'une chaîne de caractères.
Désormais le tableau de données est disponible sous R par l'objet nommé MesDonnees.
MesDonnees
V1,...,V8 sont les noms des colonnes par défaut :
names(MesDonnees)
On peut les modifier par l'instruction suivante :
names(MesDonnees) <- c('sexe', 'age', 'taille', 'poids', 'tabac','sport', 'mesure', 'alcool')
MesDonnees
Or, tous les tableaux de données n'ont pas la forme du tableau ci-dessus. Plusieurs options permettent de paramétrer précisément l'importation de données afin de pouvoir gérer des différents formats de tableau.
Souvent la première ligne indique les noms des colonnes comme dans le tableau suivant :
Pour importer ce tableau (enregistré dans le répertoire de travail sous le nom MonFichier2.txt), on rajoute l'option header=TRUE :
MesDonnees2 <- read.table(file= "MonFichier2.txt", header=TRUE)
MesDonnees2
Le contenu de la première ligne n'est alors pas considéré comme des valeurs de mesure, mais comme des noms de variables.
Dans l'exemple précédent, les différentes valeurs sont séparées par la tabulation (\t), mais d'autres caractères peuvent être utilisés comme séparateur afin de pouvoir distinguer les valeurs entre elles. Par exemple, le tableau du fichier MonFichier3.txt :
On indique le séparateur (ici ;) au logiciel avec l'option sep =";" :
MesDonnees3 <- read.table(file= "MonFichier3.txt", header=TRUE, sep =";")
MesDonnees3
En toute généralité, pour l'importation des données il est primordial de commencer par ouvrir et regarder le fichier texte de départ afin de bien déterminer les options nécessaires pour que l'importation sous R se fasse correctement.
On considère un tableau de données qui renseigne quelques caractéristiques de cathédrales anglaises. Plus précisément, le tableau contient le nom de la cathédrale, son style d'architecture (gothique ou romane) et les dimensions de celle-ci (en pied).
Afin d'illustrer certaines commandes pour les dataframes, nous chargeons par la commande suivante le jeu de donnée ToothGrowth (disponible dans la librairie datasets) :
library(datasets)
head(ToothGrowth)
La fonction head() permet d'afficher les 5 premières lignes d'un dataframe (c'est pratique notamment quand le tableau est très grand).
Ce jeu de données est le résultat d'une étude sur l'impact de la vitamine C sur la croissance des dents. Dans le cadre de cette étude, 60 cochons ont reçu des doses variées de vitamine C (0.5, 1 ou 2 mg/jour), soit sous forme de jus d'orange (OJ), soit en acide ascorbique (VC). A la fin d'étude, la longueur des dents des cochons a été mesurée.
L'accès aux variables (colonnes) d'un tableau se fait avec le symbole $ et le nom de la variable :
ToothGrowth$len
ou avec les crochets [ ] et le numéro de la colonne :
ToothGrowth[,1]
Notez que ToothGrowth\$len (ou ToothGrowth[,1]) est un objet de type vecteur.
L'accès aux lignes se fait aussi avec les crochets :
ToothGrowth[1:3,]
On peut aussi utiliser :
ToothGrowth[9:12,c(1,3)]
En indéxant avec un vecteur de type logique, on peut également sélectionner des parties d'un tableau :
vec_TFF <- rep(c(TRUE,FALSE,FALSE),times=20)
ToothGrowth[vec_TFF,1]
Pour connaître le nombre de cochons traités au jus d'orange, on crée d'abord un vecteur logique qui vaut TRUE si et seulement si l'élément correspondant de la deuxième colonne (variable supp) est égal à OJ, et ensuite on calcule la somme de ce vecteur logique qui correspond au nombre de cochons traités au jus d'orange :
vec_logiq_OJ <- ToothGrowth$supp=='OJ'
print(vec_logiq_OJ)
sum(vec_logiq_OJ)
Afin de rajouter une nouvelle variable à un tableau existant, on fait comme si cette colonne existe et on lui affecte des valeurs :
ToothGrowth$nouv_var <- vec_TFF
head(ToothGrowth)
typeof(ToothGrowth$nouv_var)
Vous voyez qu'il est un peu lourd de toujours taper le nom du tableau ToothGrow pour accéder à ses éléments. L'exécution de la commande attach rend les noms des variables du tableau directement accéssible. Essayons d'abord :
len
Maintenant on fait un appel à attach et on reessaie :
attach(ToothGrowth)
len
Avant de modifier le dataframe, il convient d'exécuter d'abord la commande detach( ), effectuer la modification et ensuite refaire un attach du nouveau tableau. Exemple:
detach()
names(ToothGrowth) <- c('len','supp','dose','TFF')
head(ToothGrowth)
attach(ToothGrowth)
TFF
Pour les données des cathédrales :