Aller au contenu principal

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

  1. Numérique : comprend les entiers et les nombres à virgule flottante
  2. Caractère : représente une information textuelle
  3. 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"))
Explorer les liensOuvrir le réseau