Indexation et sélection en R : [, [[ et $

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

Date de publication

26 juin 2026

Modifié

7 juillet 2026

AstucePoints clés
  • [ 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.
  • Quatre façons d’indexer un vecteur : position positive, position négative (exclure), par nom et par condition logique.
  • Les matrices prennent deux index, m[i, j] ; une tranche d’une seule ligne ou d’une seule colonne devient silencieusement un vecteur sauf si vous passez drop = FALSE.

Introduction

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.

ages <- c(Nicolas = 27, Thierry = 33, Bernard = 26, Jerome = 41)
ages
Nicolas Thierry Bernard  Jerome 
     27      33      26      41 

Indexer un vecteur de quatre façons

Un vecteur est l’objet le plus simple à indexer, et les quatre schémas présentés ici se retrouvent partout ailleurs.

Par position

Placez la position entre crochets simples. R compte à partir de 1, pas de 0 — le premier élément est [1].

ages[2]            # the second element
Thierry 
     33 
ages[c(1, 3)]      # the first and third
Nicolas Bernard 
     27      26 
ages[1:3]          # a range
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.

Par nom

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.

ages["Bernard"]
Bernard 
     26 
ages[c("Nicolas", "Jerome")]
Nicolas  Jerome 
     27      41 

Par position négative (exclure)

Un index négatif supprime cet élément et conserve le reste.

ages[-1]           # everything except the first
Thierry Bernard  Jerome 
     33      26      41 
ages[-c(1, 2)]     # drop the first two
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.

Par condition logique

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.

ages > 30                 # the logical vector itself
Nicolas Thierry Bernard  Jerome 
  FALSE    TRUE   FALSE    TRUE 
ages[ages > 30]           # keep elements where the condition is TRUE
Thierry  Jerome 
     33      41 
ages[ages != 27]          # not equal to 27
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 positions

Parfois vous voulez les positions qui satisfont une condition, pas les valeurs. which() convertit un vecteur logique en les index qui sont à TRUE.

which(ages > 30)          # which positions are TRUE
Thierry  Jerome 
      2       4 
which.max(ages)           # position of the maximum
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().

Listes : [, [[ 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.

family <- list(
  mother  = "Veronique",
  father  = "Michel",
  sisters = c("Alicia", "Monica")
)
family
$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.

family[["sisters"]]       # the vector inside, length 2
[1] "Alicia" "Monica"
family[[3]]               # same component, by position
[1] "Alicia" "Monica"

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

family$father
[1] "Michel"
family$sisters
[1] "Alicia" "Monica"

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

family["father"]          # a LIST of length 1
$father
[1] "Michel"
class(family["father"])   # still "list"
[1] "list"
class(family[["father"]]) # "character" — the value itself
[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.

family[["sisters"]][1]    # first element of the sisters vector
[1] "Alicia"

Matrices : deux index, m[i, j]

Une matrice s’indexe par [ligne, colonne]. Laissez un emplacement vide pour prendre toute cette dimension.

m <- matrix(1:12, nrow = 3,
            dimnames = list(c("r1", "r2", "r3"),
                            c("a", "b", "c", "d")))
m
   a b c  d
r1 1 4 7 10
r2 2 5 8 11
r3 3 6 9 12
m[2, ]          # row 2 (all columns)
 a  b  c  d 
 2  5  8 11 
m[, "c"]        # column "c" (all rows), by name
r1 r2 r3 
 7  8  9 
m[2, 3]         # the single value at row 2, column 3
[1] 8
m[m[, "a"] > 1, ]  # rows where column a > 1 (logical on a column)
   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.

Le piège de 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.

class(m[2, ])               # "integer" — dropped to a vector!
[1] "integer"
class(m[2, , drop = FALSE]) # "matrix" — structure kept
[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 ».

Essayez en direct

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

🟢 Avec un agent IA

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 →

Problèmes courants

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

Questions fréquentes

[ (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.

Testez vos connaissances

À 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".

# 1. a range or c(3, 4)
# 2. a logical condition: scores > 50
# 3. drop by name -> invert a name match with !=
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)
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".

Conclusion

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.

Leçons connexes

Cette page vous a-t-elle été utile ?

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.

Commencer gratuitement →

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

Passer à Pro →

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

Partager cette pageXLinkedInRedditHN
Note

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.

Réutilisation

Citation

BibTeX
@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}
}
Veuillez citer ce travail comme suit :
“Indexation et sélection en R : [, [[ et $.” 2026. June 26. https://www.datanovia.com/learn/programming/r-foundations/indexing-subsetting.