ages <- c(Nicolas = 27, Thierry = 33, Bernard = 26, Jerome = 41)
agesNicolas Thierry Bernard Jerome
27 33 26 41
Extraire des éléments de vecteurs, de listes et de matrices par position, par nom ou par condition
Indexez et sélectionnez des objets R avec [, [[ et $. Sélectionnez les éléments d’un vecteur par position, par nom, par index négatif et par condition logique ; indexez listes et matrices ([i, j]) ; utilisez which() ; et évitez le piège de drop =. Explication en langage clair de [ vs [[ vs $.
26 juin 2026
7 juillet 2026
[ conserve la structure et peut renvoyer plusieurs éléments : x[c(1, 3)], x[-2], x[x > 5].[[ extrait un seul élément et descend d’un niveau — utilisez-le pour un composant unique d’une liste : mylist[["name"]].$ est un raccourci nommé pour [[ : mylist$name équivaut à mylist[["name"]], pour les noms connus au moment où vous écrivez le code.m[i, j] ; une tranche d’une seule ligne ou d’une seule colonne devient silencieusement un vecteur sauf si vous passez drop = FALSE.Vous avez un vecteur de valeurs et vous voulez la troisième, ou chaque valeur au-dessus d’un seuil, ou tout sauf les deux premières. Vous avez une liste et vous voulez en extraire un composant. Vous avez une matrice et vous voulez la ligne 2. Tout cela, c’est de l’indexation — et en R cela passe par trois opérateurs : [, [[ et $.
Maîtrisez bien ces trois opérateurs et le reste de R s’enchaîne : la sélection dans un data frame, lapply, la sortie d’un modèle, le JSON — ce sont tous les mêmes opérateurs sur des objets plus grands. Cette leçon couvre le cas général sur les vecteurs, les listes et les matrices.
Vous travaillez avec les lignes et les colonnes d’un data frame ? Ce sont les mêmes opérateurs sur un objet en 2D — la série data-wrangling le couvre directement : sélectionner des colonnes et filtrer des lignes. Cette page est le fondement du langage qui les sous-tend.
Nous construisons un petit vecteur nommé que nous indexerons tout au long de la leçon. c() concatène les valeurs ; names() les étiquette.
Un vecteur est l’objet le plus simple à indexer, et les quatre schémas présentés ici se retrouvent partout ailleurs.
Placez la position entre crochets simples. R compte à partir de 1, pas de 0 — le premier élément est [1].
Thierry
33
Nicolas Bernard
27 26
Nicolas Thierry Bernard
27 33 26
ages[c(1, 3)] renvoie un vecteur de longueur deux — [ conserve la structure et restitue autant d’éléments que vous en demandez.
Si le vecteur est nommé, indexez avec la chaîne du nom plutôt qu’avec une position — c’est plus clair et indépendant de l’ordre.
Un index négatif supprime cet élément et conserve le reste.
Thierry Bernard Jerome
33 26 41
Bernard Jerome
26 41
Vous ne pouvez pas mélanger index positifs et négatifs dans le même [ ] — ages[c(1, -2)] est une erreur. Choisissez une seule direction.
C’est celle que vous utiliserez le plus souvent. Une condition comme ages > 30 produit un vecteur logique (TRUE/FALSE par élément) ; l’indexation avec ce vecteur conserve les positions à TRUE.
Nicolas Thierry Bernard Jerome
FALSE TRUE FALSE TRUE
Thierry Jerome
33 41
Thierry Bernard Jerome
33 26 41
La condition et le vecteur s’alignent élément par élément, si bien que ages[ages > 30] se lit « les âges qui sont supérieurs à 30 ».
which() — convertir une condition en positionsParfois vous voulez les positions qui satisfont une condition, pas les valeurs. which() convertit un vecteur logique en les index qui sont à TRUE.
Thierry Jerome
2 4
Jerome
4
which() est pratique lorsque vous avez besoin de l’index pour vous en servir ailleurs — par exemple pour sélectionner un second vecteur aux mêmes positions, ou pour trouver où se situe le maximum avec which.max() / which.min().
[, [[ et $Une liste contient des objets de tout type et de toute longueur. Ici les trois opérateurs diffèrent réellement, et les confondre est le bug d’indexation le plus courant en R.
$mother
[1] "Veronique"
$father
[1] "Michel"
$sisters
[1] "Alicia" "Monica"
[[ extrait un composant[[ plonge dans la liste et renvoie le composant lui-même — ici un vecteur de caractères.
$ est le raccourci lisible pour [[family$sisters équivaut exactement à family[["sisters"]]. Utilisez $ quand vous connaissez le nom au moment où vous l’écrivez ; utilisez [[ quand le nom est dans une variable (nm <- "sisters"; family[[nm]]).
[ conserve une liste (une sous-liste)Les crochets simples sur une liste renvoient une liste plus petite, pas le contenu — c’est la distinction qui fait trébucher les gens.
$father
[1] "Michel"
[1] "list"
[1] "character"
Ainsi family["father"] vous donne une liste contenant un élément ; family[["father"]] vous donne l’élément. Plongez d’un niveau supplémentaire dans un composant en chaînant : family[["sisters"]][1] est la première sœur.
m[i, j]Une matrice s’indexe par [ligne, colonne]. Laissez un emplacement vide pour prendre toute cette dimension.
a b c d
r1 1 4 7 10
r2 2 5 8 11
r3 3 6 9 12
a b c d
2 5 8 11
r1 r2 r3
7 8 9
[1] 8
a b c d
r2 2 5 8 11
r3 3 6 9 12
Les quatre schémas vectoriels — position, nom, négatif, logique — fonctionnent dans chaque emplacement, indépendamment pour les lignes et les colonnes.
drop =Quand vous sélectionnez une seule ligne ou une seule colonne, R simplifie obligeamment le résultat d’une matrice en un vecteur — ce qui casse le code qui attendait une matrice en retour.
[1] "integer"
[1] "matrix" "array"
Ajoutez drop = FALSE chaque fois que vous avez besoin qu’une tranche d’une seule ligne ou d’une seule colonne reste une matrice (ou, plus tard, qu’un data frame à une seule colonne reste un data frame). C’est la source de nombreuses surprises du type « pourquoi ma matrice s’est-elle transformée en vecteur ».
Les blocs ci-dessus ont été exécutés au moment de la construction. Modifiez celui-ci et appuyez sur Run pour indexer par vous-même — il s’exécute dans votre navigateur via webR (aucune installation).
Collez un objet que vous n’arrivez pas à indexer — une liste issue d’une API, la sortie d’un modèle, un résultat imbriqué — et demandez à Prova « comment extraire X avec [[ ou $ ? ». Comme le runtime est juste là, vous exécutez sa réponse pour confirmer qu’elle renvoie bien la pièce que vous vouliez, et non une sous-liste. Demander à Prova →
$ renvoie NULL et le reste de votre code casse. $ ne correspond qu’aux noms que vous tapez littéralement et ne renvoie pas d’erreur sur une faute de frappe — family$sister (sans le « s ») renvoie discrètement NULL. Vérifiez le nom avec names(family), ou utilisez [["sister"]] qui est tout aussi discret mais se combine avec %in% pour une vérification sûre : "sister" %in% names(family).
[ m’a donné une liste alors que je voulais la valeur. Les crochets simples sur une liste renvoient toujours une liste. Pour obtenir le contenu d’un composant, utilisez les crochets doubles : family[["sisters"]], pas family["sisters"]. La forme à crochets simples sert à conserver un sous-ensemble de la liste.
Ma ligne unique de matrice s’est transformée en vecteur. R supprime la dimension lorsqu’une tranche a une seule ligne ou colonne. Passez drop = FALSE : m[2, , drop = FALSE] la garde sous forme de matrice.
Résultat vide à partir d’un index logique. Si x[x > 100] ne renvoie rien, c’est que la condition n’a correspondu à aucun élément — vérifiez-la seule (x > 100) et méfiez-vous des NA : une comparaison contre NA donne NA, qui s’indexe comme « à supprimer ». Enveloppez avec which() ou traitez d’abord les NA (x[!is.na(x) & x > 100]).
[ (crochet simple) sélectionne et conserve la structure — sur un vecteur il renvoie un vecteur (éventuellement plus court), sur une liste il renvoie une liste plus petite. [[ (crochet double) extrait un seul élément et descend d’un niveau — sur une liste il renvoie le composant lui-même (un vecteur, un data frame, …), pas une liste à un élément. Règle générale : [ pour en sélectionner plusieurs et conserver le conteneur ; [[ pour extraire un seul élément du conteneur.
x$name est un raccourci lisible pour x[["name"]] — tous deux extraient un composant nommé d’une liste (ou une colonne d’un data frame). La différence : $ ne fonctionne qu’avec un nom que vous tapez littéralement dans le code, tandis que [[ accepte aussi un nom contenu dans une variable (nm <- "name"; x[[nm]]) ou une position (x[[2]]). Utilisez $ pour la commodité interactive, [[ quand le nom est calculé.
Indexez avec une condition logique : x[x > 5] conserve les éléments où x > 5 vaut TRUE. La condition produit un vecteur TRUE/FALSE de la même longueur que x, et [ conserve les positions à TRUE. Combinez les conditions avec & (et) / | (ou) : x[x > 5 & x < 20].
Utilisez un index négatif : x[-1] supprime le premier élément, x[-c(1, 2)] supprime les deux premiers. L’indexation négative ne fonctionne qu’avec les positions, pas les noms — pour supprimer par nom, inversez une correspondance : x[names(x) != "Bernard"]. Vous ne pouvez pas mélanger index positifs et négatifs dans un même [ ].
R simplifie par défaut une tranche d’une seule ligne ou d’une seule colonne d’une matrice en un vecteur (drop = TRUE). Ajoutez drop = FALSE pour conserver la structure de matrice : m[2, , drop = FALSE]. Le même argument conserve sous forme de data frame une tranche d’une seule colonne d’un data frame.
À partir du vecteur ci-dessous : (1) récupérez les troisième et quatrième éléments par position, (2) ne conservez que les éléments supérieurs à 50, et (3) supprimez l’élément nommé "b".
scores <- c(a = 90, b = 45, c = 67, d = 30, e = 88)
pos <- scores[3:4]
big <- scores[scores > 50]
no_b <- scores[names(scores) != "b"]
list(pos = pos, big = big, no_b = no_b)
mylist <- list(x = 1:3, y = "ok"). Quel appel renvoie le caractère "ok" lui-même ?
A. mylist["y"] B. mylist[["y"]] C. mylist[2]
Afficher la réponse
B. [[ extrait le composant, donc mylist[["y"]] (et mylist$y) renvoie "ok". A et C utilisent tous deux des crochets simples, qui renvoient une liste de longueur 1 — class() de A et C est "list", pas "character".
L’indexation en R, c’est trois opérateurs et quatre schémas. [ sélectionne et conserve le conteneur (position, nom, négatif ou logique) ; [[ extrait un seul élément et descend d’un niveau ; $ est le raccourci lisible pour [[ sur un nom connu. Les matrices ajoutent un second index, m[i, j], avec drop = FALSE quand vous avez besoin de préserver la structure. Maîtrisez ces opérateurs sur les vecteurs et les listes et tout objet plus grand — data frames, sortie de modèle, résultats imbriqués — s’indexe de la même façon.
Prouvez que vous savez le faire. Maîtrisez toute la série Les bases de R — suivez votre parcours, construisez des projets et obtenez un certificat.
Passez à Pro — Prova illimité sur vos propres données et un certificat vérifiable qui atteste la compétence.
dès 15 $/mois facturé annuellement
✓ Vous êtes Pro — continuez. The runtime is the judge.
Recevez les nouvelles leçons R & Python par e-mail
Pratique, reproductible, sans spam. Désinscription à tout moment.
Double opt-in. Nous ne partageons jamais votre e-mail.
Cette leçon est reproductible : chaque résultat de cette page a été produit par le code affiché — modifiez n’importe quel bloc et appuyez sur Run pour le reproduire dans votre navigateur. The runtime is the judge.
@online{2026,
author = {},
title = {Indexation et sélection en R : {[}, {[}{[} et \$},
date = {2026-06-26},
url = {https://www.datanovia.com/learn/programming/r-foundations/indexing-subsetting},
langid = {fr}
}