Les autres types
Informatique — R, chapitre 2
Le chapitre précédent n’a manipulé que des nombres. Or une enquête contient aussi des noms, des réponses par oui ou non, des catégories, et des cases vides. R traite chacun de ces cas avec un type dédié — dont l’un, le facteur, n’existe dans aucun autre langage courant.
2.1 Le texte
2.1.1 Créer et assembler
Une chaîne de caractères s’écrit entre guillemets, doubles ou simples, indifféremment.
paste insère un espace par défaut, paste0 n’insère rien. La confusion entre les deux est la première source de sorties mal formatées.
2.1.2 Mesurer et transformer
length et nchar ne mesurent pas la même chose
nchar("Tanger") vaut 6 : le nombre de caractères.
length("Tanger") vaut 1 : le nombre d’éléments du vecteur — et une chaîne, si longue soit-elle, reste un seul élément.
Essayez les deux dans la console. Cette distinction resservira à chaque chapitre.
2.1.3 Chercher et remplacer
grepl répond par vrai ou faux, grep renvoie des positions. Le l final signifie logical : c’est le même mot que dans la section suivante.
2.2 Les valeurs logiques
2.2.1 Deux valeurs, et un raccourci trompeur
T et F
R accepte T et F comme abréviations. Mais ce sont de simples variables, que n’importe quel code peut redéfinir — T <- 0 est parfaitement légal et transforme silencieusement tous vos T en zéros.
TRUE et FALSE, eux, sont des mots réservés, impossibles à écraser. Prenez l’habitude de les écrire en entier.
2.2.2 Comparer
L’égalité s’écrit avec deux signes ==. Un seul signe est une affectation, et l’erreur est facile à commettre.
2.2.3 Combiner
2.2.4 Un logique vaut un nombre
TRUE vaut 1 et FALSE vaut 0. Donc sum compte et mean calcule une proportion. Ce petit fait est probablement le raccourci le plus employé de tout R : retenez-le.
2.3 Les facteurs
2.3.1 Une variable qualitative n’est pas du texte
Un vecteur de texte est une simple suite de mots. Un facteur est une variable qualitative : R en connaît la liste des modalités possibles (les levels), même celles qui n’apparaissent pas dans les données.
Parce que R a été écrit pour la statistique. Dans une régression, une variable qualitative doit être éclatée en indicatrices, et il faut désigner une modalité de référence. Le facteur porte cette information ; un simple texte ne le pourrait pas.
Nous verrons au chapitre 7 que lm s’en sert automatiquement.
2.3.2 Les facteurs ordonnés
Sans l’argument levels, R classe les modalités par ordre alphabétique — ce qui placerait « élevé » avant « faible ». Dès que l’ordre compte, déclarez-le.
2.3.3 Le piège de la conversion
Un facteur est stocké comme un code entier renvoyant à la liste des modalités. as.numeric retourne ce code, pas l’étiquette.
Le passage par as.character est obligatoire. C’est l’une des erreurs les plus coûteuses de R, parce qu’elle ne déclenche aucun message : le calcul se poursuit avec 1, 2, 3 au lieu de 2019, 2021, 2020.
2.4 Les valeurs manquantes
2.4.1 NA n’est pas zéro
2.4.2 Le test qui ne fonctionne pas
Comparer une valeur inconnue à une valeur inconnue ne peut donner qu’une réponse inconnue. R est logique : NA == NA vaut NA. D’où l’existence de is.na.
2.4.3 Trois absences différentes
| Valeur | Signification |
|---|---|
NA |
donnée manquante — la case existe, la valeur est inconnue |
NULL |
objet vide — il n’y a pas de case du tout |
NaN |
résultat de calcul impossible, comme 0/0 |
2.5 Connaître et convertir un type
Les fonctions de conversion portent toutes le préfixe as. : as.numeric, as.character, as.logical, as.factor.
c(1, "deux", TRUE)R ne proteste pas : il convertit tout au type le plus général, ici le texte. Vos nombres deviennent silencieusement des chaînes, et le calcul suivant échoue sans que la cause soit visible.
L’ordre est : logique → numérique → texte. Un seul mot dans une colonne de mille nombres suffit à convertir la colonne entière.
À vous
Une classe a obtenu les notes 12, 8, 15, 6, 17, 11 et une note manquante. Calculez la moyenne en ignorant l’absence, comptez les notes supérieures ou égales à 10, et donnez la proportion de reçus.
mean(notes, na.rm = TRUE) # 11.5
sum(notes >= 10, na.rm = TRUE) # 4
mean(notes >= 10, na.rm = TRUE) # 0.667
sum(is.na(notes)) # 1 valeur manquanteNotez que na.rm = TRUE est nécessaire jusque dans le comptage : sans lui, le NA contamine aussi sum.
Ce qu’il faut retenir
| Écriture | Effet |
|---|---|
paste, paste0 |
assembler du texte, avec ou sans espace |
nchar, toupper, substr |
mesurer et transformer une chaîne |
grepl, grep, sub |
chercher et remplacer un motif |
TRUE / FALSE |
valeurs logiques, jamais T / F |
==, !=, &, \|, ! |
comparer et combiner |
sum(cond), mean(cond) |
compter et calculer une proportion |
factor, levels, table |
variable qualitative et ses effectifs |
as.numeric(as.character(f)) |
convertir un facteur en nombres |
is.na, na.rm = TRUE |
repérer et ignorer les manquantes |
class, as.* |
connaître et convertir un type |
Le chapitre suivant exploite systématiquement ces conditions logiques pour extraire et filtrer : ne garder d’un jeu de données que les observations qui remplissent un critère.