Le type des données

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.

Type numérique (numeric)

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 :

In [ ]:
var.a <- 1.7
typeof(var.a)
In [ ]:
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.

In [ ]:
var.c <- as.integer(var.b)
typeof(var.c)

Type booléen ou logique (logical)

R sait répondre à certaines questions simples, pas avec "oui" ou "non", mais avec TRUE ou FALSE. Voici quelques exemples:

In [ ]:
# égalité des valeurs de var.a et var.b ?
var.a==var.b
In [ ]:
# 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 :

In [ ]:
is.numeric(var.b)
In [ ]:
is.integer(var.b)
In [ ]:
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:

In [ ]:
TRUE + FALSE
In [ ]:
TRUE/2 - var.b
In [ ]:
(TRUE + T)^2 + FALSE*F + T*FALSE + F

Type chaînes de caractères (character)

Toute information mise entre guillemets (simple ' ou double ") correspond à une chaîne de caractères :

In [ ]:
string1 <- "I love maths"
string1
In [ ]:
typeof(string1)
In [ ]:
string2 <- 'Moi aussi !'
string2
In [ ]:
is.character(string2)

Conversion de type

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:

In [ ]:
# Conversion vers une chaîne de caractères
as.character(2.3)
In [ ]:
# Conversion depuis une chaîne de caractères
string3 <- "2.3"
as.numeric(string3)
In [ ]:
# Conversion depuis une chaîne de caractères
as.integer(string3)
In [ ]:
# Conversion impossible
as.integer(string1)

Structure des données

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.

Les vecteurs

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 :

In [ ]:
vec.num <- c(1,4,9,2,0)
vec.num
In [2]:
vec.char <- c("R","c'est","trop","facile","!")
vec.char
  1. "R"
  2. "c'est"
  3. "trop"
  4. "facile"
  5. "!"

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 :

In [ ]:
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 :

In [3]:
vec.char2 <- c("R","c'est pas","mon","truc","!")
vec.char2
vec.logique2 <- (vec.char == vec.char2)
vec.logique2
  1. "R"
  2. "c'est pas"
  3. "mon"
  4. "truc"
  5. "!"
  1. TRUE
  2. FALSE
  3. FALSE
  4. FALSE
  5. TRUE

Conversion automatique

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.

In [ ]:
c(3,TRUE,7)
In [ ]:
c(3,T,"7")

Suites régulières

On peut créer des vecteurs particuliers grâce à des suites régulières.

Exercice 1

Exécutez les commandes suivantes et utilisez l'aide afin de comprendre

  • l'utilisation des deux-points : ,
  • la fonction seq et ses arguments length et by,
  • la fonction rep et ses arguments times et each.
In [ ]:
2:5
In [ ]:
.5:4
In [ ]:
12:-4
In [ ]:
seq(2,6)
In [ ]:
seq(2,6,by=.2)
In [ ]:
seq(2,6,length=4)
In [ ]:
rep(1,5)
In [ ]:
rep(1:3,times=4)
In [ ]:
rep(1:3,each=4)

Les tableaux (dataframe)

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 :

1 33 170 70 1 0 0.52 occas 2 33 177 67 2 0 0.42 occas 2 53 164 63 1 0 0.65 non 2 42 169 76 1 1 0.48 occas 2 53 152 54 0 0 0.45 occas

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

In [ ]:
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.

In [ ]:
MesDonnees

V1,...,V8 sont les noms des colonnes par défaut :

In [ ]:
names(MesDonnees)

On peut les modifier par l'instruction suivante :

In [ ]:
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 :

sexe age taille poids tabac sport mesure alcool 1 33 170 70 1 0 0.52 occas 2 33 177 67 2 0 0.42 occas 2 53 164 63 1 0 0.65 non

Pour importer ce tableau (enregistré dans le répertoire de travail sous le nom MonFichier2.txt), on rajoute l'option header=TRUE :

In [ ]:
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 :

SEXE;AGE;taille;poids;tabac;SPORT;mesure;alcool 1;33;170;70;1;0;0.52;occas 2;33;177;67;2;0;0.42;occas 2;53;164;63;1;0;0.65;non

On indique le séparateur (ici ;) au logiciel avec l'option sep =";" :

In [ ]:
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.

Exercice 2

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).

  • Ouvrez RStudio et changez le répertoire de travail.
  • Rendez-vous sur Sakai et téléchargez le tableau cathedral.txt et enrégitrez-le dans votre répertoire de travail.
  • Afin d'importer le tableau sous R, ouvrez d'abord le fichier cathedral.txt pour déterminer les options de la fonction read.table( ) (notamment header et sep).
  • Retournez dans RStudio et importez les données sous forme d'un dataframe, que vous nommez cath.
  • Pour vous familiariser avec le tableau de données,
    • utiliser la fonction class( ) pour vérifier le type de l'objet cath,
    • utilisez les fonctions nrow( ), ncol( ) ou dim( ) pour connaître le nombre de variables et le nombre de cathédrales de ce jeu de données,
    • utilisez la fonction names( ) pour connaitre les noms des variables

Manipulation d'un dataframe

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) :

In [1]:
library(datasets)
head(ToothGrowth)
lensuppdose
14.2VC 0.5
211.5VC 0.5
37.3VC 0.5
45.8VC 0.5
56.4VC 0.5
610 VC 0.5

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 :

In [ ]:
ToothGrowth$len

ou avec les crochets [ ] et le numéro de la colonne :

In [ ]:
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 :

In [ ]:
ToothGrowth[1:3,]

On peut aussi utiliser :

In [ ]:
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 :

In [ ]:
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 :

In [ ]:
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 :

In [ ]:
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 :

In [ ]:
len

Maintenant on fait un appel à attach et on reessaie :

In [ ]:
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:

In [ ]:
detach()
names(ToothGrowth) <- c('len','supp','dose','TFF')
head(ToothGrowth)
attach(ToothGrowth)
TFF

Exercice 3

Pour les données des cathédrales :

  • Combien de cathédrales sont en style romane ?
  • Affichez les noms de toutes les cathédrales romanes.
  • Les dimensions de cathédrale dans le tableau sont renseignées en pied. Sachant qu'un pied correspond à 0,3048 mètres, transformez les dimensions en mètres.
  • Quelle est la longueur moyenne des cathédrales ? Et la longueur moyenne des cathédrales romanes ?
  • Affichez toutes les cathédrales dans la nef est plus haute que 22 mètres.
  • Ajouter au tableau une colonnes avec le rapport longueur/hauteur.
  • Appliquer la fonction summary au tableau et observer la sortie.
In [ ]: