Filtrer les lignes en R : subset() base R & filter() dplyr
Conserver les lignes qui remplissent une condition — crochets base R et subset(), et filter() de dplyr
Filtrez les lignes d’un data frame en R avec la base R df[df$x > 5, ] et subset(), ou filter() de dplyr. Filtrez selon une ou plusieurs conditions (&, |, %in%, between()), conservez les n premières lignes avec head()/slice(), et gérez la différence de NA entre [ et filter() — les deux approches, même résultat.
Date de publication
26 juin 2026
Modifié
7 juillet 2026
AstucePoints clés
base R :df[df$x > 5, ] conserve les lignes où la condition est TRUE ; subset(df, x > 5) en est la forme plus lisible.
dplyr :filter(df, x > 5) fait la même chose ; combinez les conditions avec & / |, ou simplement des virgules (= ET).
Appartenance & intervalles :x %in% c("a", "b") et between(x, lo, hi) conservent les lignes correspondant à un ensemble ou à un intervalle.
n premières lignes :head(df, 5), df[1:5, ], ou slice(df, 1:5) / slice_head(df, n = 5) de dplyr.
Piège des NA : la base [ conserve une ligne fantôme entièrement NA lorsque la condition vaut NA ; subset() et filter() la suppriment. Utilisez filter() ou which() pour éviter le problème.
Introduction
La plupart des analyses commencent par conserver les lignes qui comptent — les patients de plus de 60 ans, les commandes du dernier trimestre, l’espèce qui vous intéresse. C’est le filtrage (ou la sélection) de lignes selon une condition.
Cette leçon couvre les deux approches que vous rencontrerez dans du code réel :
base R — indexez avec [ à l’aide d’une condition logique, ou utilisez subset() pour une lecture plus claire ; aucun package nécessaire.
dplyrfilter() — la valeur par défaut moderne, avec des aides comme %in% et between().
Elles donnent les mêmes lignes, vous pouvez donc lire n’importe quel code et choisir celle que vous préférez. Il y a une vraie différence — la manière dont chacune gère les valeurs manquantes — et nous l’abordons directement. Nous utilisons le jeu de données intégré iris :
Le crochet [ prend les lignes avant la virgule et les colonnes après. Une condition logique dans l’emplacement des lignes conserve les lignes où elle vaut TRUE. Ici, nous conservons les fleurs dont le sépale dépasse 7 :
Notez la virgule finale — iris[condition, ] conserve toutes les colonnes. La condition iris$Sepal.Length > 7 est un vecteur de TRUE/FALSE, un par ligne.
subset() exprime la même chose sans répéter le nom du data frame — vous écrivez la colonne sans préfixe :
slice_head(iris, n = 5) conserve les 5 premières et slice_max(iris, Sepal.Length, n = 3) conserve les 3 plus grandes — pratique quand « premières » signifie « en tête selon une valeur » :
C’est la seule vraie différence, et elle piège les gens. Lorsqu’une condition s’évalue à NA (parce que la valeur de la colonne est manquante), la base [ conserve une ligne fantôme entièrement NA, tandis que subset() et filter() la suppriment discrètement.
# a small frame with a missing valuedf <-data.frame(id =1:4, x =c(10, NA, 30, 5))# base [: the NA condition leaks a phantom all-NA rowdf[df$x >8, ]
id x
1 1 10
NA NA NA
3 3 30
Cette ligne NA NA n’est presque jamais ce que vous voulez. subset() et filter() la gèrent correctement :
library(dplyr)subset(df, x >8) # base, but NA-safe
id x
1 1 10
3 3 30
filter(df, x >8) # dplyr, NA-safe
id x
1 1 10
2 3 30
Si vous devez utiliser le [ brut, enveloppez la condition dans which() — il renvoie uniquement les positions TRUE et ignore les NA :
df[which(df$x >8), ]
id x
1 1 10
3 3 30
Règle générale : préférez filter() ou subset() ; si vous recourez au [ brut sur une colonne susceptible de contenir des NA, utilisez which().
Essayez en direct
Les blocs ci-dessus ont été exécutés au moment de la génération. Modifiez celui-ci et appuyez sur Run pour filtrer des lignes par vous-même — il s’exécute dans votre navigateur via webR (sans installation).
🟢 Avec un agent IA
Le filtrage réel devient vite désordonné — une plage de dates, une liste d’identifiants, des valeurs manquantes qui suppriment discrètement des lignes que vous vouliez garder. Décrivez les lignes que vous voulez et demandez à Prova« filtre pour virginica avec une longueur de sépale supérieure à 6.5, et dis-moi si des lignes avaient des NA dans cette colonne » ; elle écrit l’appel à filter(), et comme le runtime est juste là, vous l’exécutez pour confirmer que le nombre de lignes correspond à ce que vous attendiez sur vos données — le piège des NA est exactement là où un copier-coller à l’aveugle dérape. Demandez à Prova →
Vous travaillez en Python ? Un guide de filtrage de lignes pandas (masques booléens, .query(), .isin(), .between()) arrive dans la série Python.
Problèmes courants
subset()/filter() renvoie zéro ligne alors que vous en attendiez. Le plus souvent, une faute de frappe dans un niveau de facteur ou une différence de casse — Species == "Virginica" ne correspond à rien parce que le niveau est en minuscules "virginica". Vérifiez les valeurs exactes avec unique(df$Species) ou levels(df$Species).
La base [ renvoie des lignes entièrement NA superflues. La condition a produit NA sur les lignes où la colonne est manquante, et [ les conserve sous forme de lignes vides (voir la section NA ci-dessus). Passez à filter() / subset(), ou enveloppez la condition dans which().
filter() affiche « object not found ». Vous avez mis un nom de colonne entre guillemets — filter(iris, "Species" == "setosa") compare deux chaînes, jamais la colonne. dplyr prend des noms de colonnes sans guillemets : filter(iris, Species == "setosa"). (La base subset() fonctionne pareil — subset(iris, Species == "setosa"), sans guillemets.)
Questions fréquentes
NoteComment filtrer des lignes en R ?
Conservez les lignes où une condition vaut TRUE. Base R : df[df$x > 5, ] (notez la virgule finale) ou la forme plus lisible subset(df, x > 5). dplyr : filter(df, x > 5). Les trois renvoient les mêmes lignes.
NoteQuelle est la différence entre subset() et filter() ?
Elles conservent les mêmes lignes. subset() est en base R (aucun package) ; filter() est dans dplyr. Les deux prennent des noms de colonnes sans guillemets et suppriment les lignes où la condition vaut NA. La forme brute df[cond, ] est la plus rapide à taper mais conserve des lignes fantômes entièrement NA lorsque la condition est manquante, donc subset()/filter() sont plus sûres.
NoteComment filtrer des lignes selon plusieurs conditions en R ?
Joignez les conditions avec & (ET) ou | (OU) : subset(df, x > 5 & y == "a"). Dans filter() de dplyr, une virgule entre conditions signifie aussi ET : filter(df, x > 5, y == "a"). Pour correspondre à un ensemble de valeurs, utilisez %in% : filter(df, group %in% c("a", "b")).
NoteComment sélectionner des lignes précises par numéro en R ?
Indexez par position : df[c(1, 3, 5), ] conserve les lignes 1, 3 et 5 ; df[1:10, ] conserve les dix premières ; head(df, 10) est le raccourci lisible. En dplyr, slice(df, 1:10) ou slice_head(df, n = 10) font la même chose.
NotePourquoi mon filtre conserve-t-il des lignes avec des valeurs NA ?
La base df[df$x > 5, ] conserve une ligne vide entièrement NA dès que x est manquant, parce que la comparaison renvoie NA (et non FALSE). Utilisez subset() ou filter() de dplyr, qui suppriment ces lignes automatiquement, ou enveloppez la condition dans which() : df[which(df$x > 5), ].
Testez vos connaissances
ImportantExercice : filtrer avec une condition composée, de deux façons
À partir d’iris, conservez les lignes où Species est setosa ou versicoloretSepal.Width est supérieure à 3. D’abord avec subset() en base R, puis avec filter() de dplyr — et confirmez que les deux renvoient le même nombre de lignes.
# base R: subset(iris, Species %in% c("setosa", "versicolor") & Sepal.Width > 3)# dplyr: filter(iris, Species %in% c("setosa", "versicolor"), Sepal.Width > 3)
library(dplyr)base_way <-subset(iris, Species %in%c("setosa", "versicolor") & Sepal.Width >3)dplyr_way <-filter(iris, Species %in%c("setosa", "versicolor"), Sepal.Width >3)nrow(base_way) ==nrow(dplyr_way) # TRUE
NoteVérification rapide : laquelle conserve les lignes où x vaut 2, 4 ou 6 ?
df possède une colonne numérique x. Quel appel conserve les lignes où x vaut l’une des valeurs 2, 4 ou 6 ?
A. filter(df, x == 2 | 4 | 6) B. filter(df, x %in% c(2, 4, 6)) C. filter(df, x == c(2, 4, 6))
Afficher la réponse
B.%in% teste l’appartenance à un ensemble — exactement ce que vous voulez. A est un bug classique : x == 2 | 4 | 6 s’interprète comme (x == 2) | 4 | 6, et les 4/6 nus sont toujours vrais, donc l’appel conserve toutes les lignes. C recycle le vecteur et ne fait correspondre qu’une ligne sur trois par position. Utilisez toujours %in% pour « l’une de ces valeurs ».
Conclusion
Le filtrage de lignes se résume à deux outils équivalents : df[cond, ] / subset(df, cond) en base R, ou filter(df, cond) de dplyr. Combinez les conditions avec & / | (ou une virgule dans filter()), correspondez à un ensemble avec %in%, à un intervalle avec between(), et prenez des lignes par position avec head() / slice(). La seule différence qui compte concerne les valeurs manquantes — subset() et filter() suppriment proprement les conditions NA, le [ brut non, alors recourez-y (ou à which()) dès qu’une colonne peut être manquante.
Prouvez que vous savez le faire. Maîtrisez toute la série Manipulation de données en R et Python — suivez votre parcours, construisez des projets et obtenez un certificat.
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 = {Filtrer les lignes en R : subset() base R \& filter() dplyr},
date = {2026-06-26},
url = {https://www.datanovia.com/learn/programming/data-wrangling/subset-rows-in-r},
langid = {fr}
}