Bases de R
Ce guide présente les opérations de base de R nécessaires pour examiner et transformer de petits jeux de données en mémoire. Il suppose R déjà installé. Exécutez des expressions dans la console pour examiner les valeurs, puis enregistrez-les dans un script pour répéter le travail. L’inférence statistique et les systèmes orientés objet sont hors de cette introduction. La référence officielle est An Introduction to R.
Syntaxe de base
Éléments d’un programme
- Structures de données : supports d’information (vecteurs, matrices, data frames, listes)
- Algorithmes : étapes permettant d’accomplir des tâches
Expressions et affectation
x <- c(2, 4, 6)
x + 1 # 3 5 7
sum(x) # 12
identical(1, 1L) # FALSE
<- lie un nom à une valeur ; == compare des valeurs. R distingue majuscules et minuscules. # commence un commentaire. 1 est normalement de type double, tandis que 1L est integer ; class() décrit le traitement d’un objet par les méthodes, et typeof() son type interne. Combiner des valeurs atomiques les convertit vers un type commun : c(1, "2") est un vecteur de caractères, pas un mélange nombres/texte.
Structures de données
Types de données élémentaires
- Numérique : comprend les entiers et les nombres à virgule flottante
- Caractère : représente une information textuelle
- Logique : valeurs booléennes (
TRUE,FALSE)
Vecteurs
Un vecteur atomique contient des éléments de même type ; un scalaire ordinaire est un vecteur de longueur 1. En R, les listes sont aussi des vecteurs, mais peuvent contenir des types différents.
Créer des vecteurs numériques
c(1.70, 1.72, 1.80, 1.66, 1.65, 1.88)
Vérifier les types de données
typeof(3.14)
class(3.14)
Opérations sur les vecteurs
heights <- c(1.70, 1.72, 1.80, 1.66, 1.65, 1.88)
mean(heights)
sd(heights)
Indexation, recyclage et valeurs manquantes
L’extraction utilise des indices commençant à 1. Les indices positifs sélectionnent, les négatifs excluent et zéro ne sélectionne rien ; ne mélangez pas indices positifs et négatifs, sauf avec zéro.
x <- c(10, 20, NA_real_, 40)
x[c(1, 4)] # 10 40
x[-2] # 10 NA 40
x[!is.na(x) & x > 15] # 20 40
mean(x) # NA
mean(x, na.rm = TRUE) # 23.33333...
stopifnot(isTRUE(all.equal(mean(x, na.rm = TRUE), 70 / 3)))
c(1, 2, 3, 4) + c(10, 20) # 11 22 13 24
NA signifie manquant, pas zéro ; testez-le avec is.na(), pas x == NA. NULL représente une absence et a une longueur nulle ; NaN est un résultat numérique indéfini, et Inf l’infini. is.na() détecte aussi NaN ; is.finite() exclut valeurs manquantes et infinies. Supprimer les valeurs manquantes change l’échantillon résumé : décidez si cette omission convient à l’analyse.
L’arithmétique recycle les vecteurs plus courts. Une longueur non multiple produit un avertissement, mais un multiple exact peut être recyclé silencieusement même si ce n’est pas voulu. Pour des mesures appariées, vérifiez l’égalité des longueurs, sauf si appliquer un scalaire à tous les éléments est intentionnel.
Vecteurs de caractères
c("Male", "Female", "Female", "Male")
Facteurs
Les facteurs servent à représenter des données catégorielles avec des niveaux.
sex <- factor(c("Male", "Female", "Female", "Male"))
levels(sex)
Vecteurs logiques
heights > 1.7
heights[heights > 1.7]
Tableaux et matrices
Tableaux à deux dimensions ou plus.
matrix(1:12, nrow = 4, ncol = 3)
Data frames
Les data frames peuvent contenir des données de types différents.
df <- data.frame(
sex = c("F", "M", "M", "F"),
age = c(17, 29, 20, 33),
heights = c(1.66, 1.84, 1.83, 1.56)
)
str(df)
Listes
Les listes peuvent contenir des éléments de types différents.
l <- list(
sex = c("F", "M"),
age = c(17, 29, 20),
heights = c(1.66, 1.84, 1.83, 1.56)
)
l$sex
Extraire le conteneur ou son contenu
is.list(l["sex"]) # TRUE: a one-element list
is.character(l[["sex"]]) # TRUE: its character vector
is.data.frame(df[, "age", drop = FALSE]) # TRUE
is.numeric(df[["age"]]) # TRUE
[ sélectionne un sous-ensemble, tandis que [[ extrait un élément ; dans un tableau de données, cet élément est généralement une colonne. $sex sélectionne un élément nommé. Les colonnes d’un tableau de données ont le même nombre de lignes, contrairement aux éléments d’une liste quelconque. Utilisez drop = FALSE si une sélection doit rester bidimensionnelle. Une matrice se remplit par colonnes par défaut : la première colonne de matrix(1:12, nrow = 4) est 1, 2, 3, 4 ; utilisez byrow = TRUE pour remplir par lignes.
Structures de contrôle
Instructions conditionnelles
If-else
age <- 16
if (age >= 18) {
message("Meets the example age threshold")
} else {
message("Below the example age threshold")
}
Switch
ch <- "b"
switch(EXPR = ch, a = 1, b = 2:3)
if exige un résultat logique unique et non manquant, selon les règles de contrôle de R. Il ne peut pas recevoir directement un vecteur tel que heights > 1.7. Utilisez un sous-ensemble logique pour sélectionner élément par élément, ou any()/all() pour une décision globale, avec une politique explicite pour les valeurs manquantes. & et | opèrent élément par élément ; && et || court-circuitent des conditions scalaires. Avec une sélection textuelle, switch() cherche une branche nommée ; sans correspondance ni valeur par défaut, il renvoie NULL.
Structures de boucle
Boucle for
for (i in 1:10) {
print(i)
}
Boucle while
v <- 10
while(v > 2) {
print(v)
v <- v - 1.1
}
Boucle repeat
i <- 1
repeat {
print(i)
i <- i * 2
if (i > 100) break
}
Pour parcourir les indices d’un objet éventuellement vide, utilisez seq_along(x), pas 1:length(x) : si la longueur est nulle, 1:0 donne les deux éléments 1, 0. break quitte la boucle la plus interne ; next passe à son itération suivante. Une boucle while ou repeat doit progresser vers sa condition d’arrêt.
Fonctions et programmation fonctionnelle
Créer des fonctions
customMean <- function(x) {
s <- i <- 0
for (j in x) {
s <- s + j
i <- i + 1
}
return(s / i)
}
Cette version pédagogique suppose un vecteur numérique et additionne chaque élément une fois. Elle renvoie NaN pour un vecteur vide (0 / 0) et propage NA ; elle ne reproduit ni les options ni les précautions numériques de mean(). Préférez mean() pour l’analyse. Sans return(), une fonction renvoie sa dernière expression évaluée ; afficher une valeur n’est pas le même contrat que la retourner.
Portée
Les affectations ordinaires dans une fonction créent des liaisons locales. Un nom absent localement est recherché dans les environnements entourant la définition de la fonction : R utilise la portée lexicale. Ici, a provient de cet environnement, donc Sum(10) renvoie 13 ; modifier ce a avant un autre appel change le résultat.
a <- 3
Sum <- function(b) {
a + b
}
Sum(10)
Passer des fonctions
Les fonctions peuvent être passées comme arguments.
f <- function(x, fun) {
fun(x)
}
f(1:10, mean)
Paquets
Installer des paquets
install.packages("ggplot2")
BiocManager::install("maftools")
remotes::install_github("tidyverse/ggplot2")
Installer télécharge le code d’un paquet dans une bibliothèque, ce qui est distinct de son attachement à une session. Les exemples Bioconductor et GitHub nécessitent respectivement BiocManager et remotes déjà installés. Ce sont des sources alternatives, pas trois étapes pour chaque projet. Utilisez les dépendances enregistrées par le projet et des sources de confiance plutôt que des commandes d’installation inconnues.
Charger des paquets
library(ggplot2)
Problèmes courants et solutions
Nombres complexes
Les nombres complexes peuvent être représentés avec i pour la partie imaginaire.
1 + 2i
Différences entre = et <-
Utilisez <- pour une affectation ordinaire et = pour nommer un argument dans un appel. Dans customMean(x = 1:100), x désigne le paramètre, sans affecter une variable de l’appelant. L’exemple suivant affecte volontairement le x de l’appelant tout en transmettant sa valeur, un effet de bord qu’il vaut généralement mieux écrire séparément.
x <- NULL
customMean(x <- 1:100)
x
Utiliser ::
package::function() appelle une fonction exportée sans attacher le paquet :
stats::median(1:5)
La forme à trois deux-points, package:::function(), atteint des éléments internes non exportés. Ces fonctions peuvent changer sans préavis ; le code applicatif ne doit donc pas en dépendre.
Ajouter des niveaux à un facteur
Le code suivant reconstruit un facteur après extension de ses valeurs textuelles ; il ajoute des catégories sans réordonner un facteur existant. Pour contrôler l’ordre, spécifiez levels = .... Affecter directement une étiquette inconnue à un facteur produit NA avec un avertissement, sauf si le niveau a été ajouté auparavant. as.numeric(factor) renvoie les codes internes des niveaux, pas les étiquettes d’apparence numérique ; passez par les caractères si ces étiquettes représentent des nombres.
sex <- factor(c(as.character(sex), "M", "M"))