0Pricing
R Academy · Leçon

Jointures entre plusieurs tables dans dplyr

Maîtrisez inner_join, left_join, right_join, full_join et anti_join.

Jointures entre plusieurs tables dans dplyr est une leçon R Academy gratuite sur CoddyKit. Ceci est la leçon 3 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage R Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours R Academy comprend 4 leçons au total.

Pourquoi joindre des tables

Les données réelles se trouvent rarement dans une seule table. Les bases de données relationnelles répartissent les informations entre plusieurs tables afin d’éviter les répétitions. Les jointures permettent de combiner des tables en fonction de clés communes. dplyr fournit des fonctions de jointure de type SQL avec une syntaxe claire et lisible.

library(dplyr)

# Two related tables
orders <- data.frame(
  order_id = 1:4,
  customer_id = c(1, 2, 1, 3),
  amount = c(250, 180, 320, 90)
)

customers <- data.frame(
  customer_id = 1:3,
  name = c('Alice','Bob','Carol'),
  city = c('NYC','LA','Chicago')
)

print(orders)
print(customers)

inner_join() — Uniquement les lignes correspondantes

inner_join(x, y, by='key') renvoie uniquement les lignes dont la clé existe dans les deux tables. Les lignes sans correspondance dans l’autre table sont supprimées. Il s’agit du type de jointure le plus courant.

library(dplyr)

orders <- data.frame(
  order_id = 1:4,
  customer_id = c(1, 2, 1, 99),
  amount = c(250, 180, 320, 90)
)

customers <- data.frame(
  customer_id = c(1, 2, 3),
  name = c('Alice','Bob','Carol')
)

# customer_id = 99 in orders has no match => dropped
# customer_id = 3 in customers has no match => dropped
inner_join(orders, customers, by = 'customer_id')

left_join() — Conserver toutes les lignes de gauche

left_join(x, y, by='key') conserve toutes les lignes de x et complète les données correspondantes de y. Les lignes de x qui n’ont aucune correspondance dans y reçoivent NA dans les colonnes de y. La table de gauche détermine le résultat.

library(dplyr)

orders <- data.frame(
  order_id = 1:4,
  customer_id = c(1, 2, 1, 99),
  amount = c(250, 180, 320, 90)
)

customers <- data.frame(
  customer_id = c(1, 2, 3),
  name = c('Alice','Bob','Carol')
)

# Order with customer_id=99 is kept, name = NA
left_join(orders, customers, by = 'customer_id')

right_join() — Conserver toutes les lignes de droite

right_join(x, y, by='key') conserve toutes les lignes de y. Les lignes de y qui n’ont aucune correspondance dans x reçoivent NA dans les colonnes de x. C’est l’équivalent inversé de left_join() — cette jointure est moins courante, car il suffit d’inverser l’ordre des tables.

library(dplyr)

orders <- data.frame(
  order_id = c(1, 2),
  customer_id = c(1, 2),
  amount = c(250, 180)
)

customers <- data.frame(
  customer_id = c(1, 2, 3),
  name = c('Alice','Bob','Carol')
)

# Carol (customer_id=3) has no orders => NA for order columns
right_join(orders, customers, by = 'customer_id')

full_join() — Conserver toutes les lignes

full_join(x, y, by='key') conserve chaque ligne des deux tables. Les lignes sans correspondance de chaque côté reçoivent NA dans les colonnes de l’autre table. Utilisez-la lorsque vous ne pouvez vous permettre de perdre aucune donnée.

library(dplyr)

q1 <- data.frame(product = c('A','B','C'), q1_sales = c(100, 200, 150))
q2 <- data.frame(product = c('A','C','D'), q2_sales = c(120, 160, 90))

# D appears only in q2, B only in q1 => both kept
full_join(q1, q2, by = 'product')

anti_join() — Trouver les lignes sans correspondance

anti_join(x, y, by='key') renvoie les lignes de x qui n’ont aucune correspondance dans y. Aucune colonne de y n’est incluse. Cette jointure est idéale pour trouver les enregistrements orphelins, les commandes sans correspondance ou les éléments absents d’une table de référence.

library(dplyr)

all_employees <- data.frame(
  id = 1:5,
  name = c('Alice','Bob','Carol','Dave','Eve')
)

trained <- data.frame(id = c(1, 3, 5))

# Who has NOT completed training?
anti_join(all_employees, trained, by = 'id')

semi_join() — Filtrer selon une correspondance

semi_join(x, y, by='key') renvoie les lignes de x qui ont une correspondance dans y, mais n’ajoute PAS les colonnes de y. C’est similaire à inner_join(), mais seules les colonnes de x sont renvoyées — ce qui est utile comme étape de filtrage.

library(dplyr)

products <- data.frame(
  id = 1:5,
  name = c('Widget','Gadget','Donut','Gizmo','Sprocket'),
  price = c(9.99, 24.99, 1.99, 14.99, 4.99)
)

ordered_products <- data.frame(id = c(1, 3, 5))

# Products that appear in at least one order
semi_join(products, ordered_products, by = 'id')

Effectuer une jointure sur des noms de colonnes différents

Lorsque les colonnes clés portent des noms différents dans x et y, utilisez la syntaxe by = c('x_col' = 'y_col'). Elle associe le nom de colonne de la table de gauche à la colonne correspondante de la table de droite.

library(dplyr)

orders <- data.frame(
  order_id = 1:3,
  user_id = c(10, 20, 10),
  amount = c(100, 200, 150)
)

users <- data.frame(
  id = c(10, 20, 30),
  username = c('alice','bob','carol')
)

# orders.user_id matches users.id
left_join(orders, users, by = c('user_id' = 'id'))

Effectuer une jointure sur plusieurs clés

Vous pouvez effectuer une jointure sur plusieurs colonnes en transmettant un vecteur à by. Toutes les colonnes indiquées doivent correspondre pour qu’une ligne soit jointe. Cette méthode permet de gérer les clés composites lorsqu’aucune colonne seule n’est unique.

library(dplyr)

actual <- data.frame(
  year = c(2023, 2023, 2024, 2024),
  quarter = c('Q1','Q2','Q1','Q2'),
  sales = c(100, 120, 130, 150)
)

target <- data.frame(
  year = c(2023, 2023, 2024, 2024),
  quarter = c('Q1','Q2','Q1','Q2'),
  target = c(110, 115, 125, 145)
)

inner_join(actual, target, by = c('year', 'quarter'))

Enchaîner plusieurs jointures

Vous pouvez enchaîner plusieurs jointures dans un même pipeline à l’aide de l’opérateur pipe. Construisez progressivement une vue dénormalisée en ajoutant, étape par étape, des informations provenant de plusieurs tables de référence.

library(dplyr)

orders <- data.frame(order_id=1:3, cust_id=c(1,2,1), prod_id=c(10,10,20))
customers <- data.frame(cust_id=1:2, name=c('Alice','Bob'))
products <- data.frame(prod_id=c(10,20), product=c('Widget','Gadget'))

orders %>%
  left_join(customers, by = 'cust_id') %>%
  left_join(products, by = 'prod_id')

Gérer les colonnes en double

Lorsque les deux tables possèdent des colonnes portant le même nom, en dehors de la clé de jointure, dplyr ajoute les suffixes .x et .y. Vous pouvez les personnaliser avec l’argument suffix, puis sélectionner ou renommer les colonnes selon vos besoins.

library(dplyr)

current <- data.frame(id=1:3, value=c(10,20,30), date=Sys.Date())
historic <- data.frame(id=1:3, value=c(8,22,28), date=Sys.Date()-365)

# Both have 'value' and 'date' columns
result <- inner_join(current, historic, by='id',
                     suffix=c('_current','_historic'))
print(names(result))

Vérification rapide

Quelle jointure dplyr renvoie uniquement les lignes de la table de gauche qui n’ont aucune ligne correspondante dans la table de droite ?

Récapitulatif&nbsp;: jointures dplyr

Points essentiels sur les jointures de plusieurs tables avec dplyr :

  • inner_join() — uniquement les lignes correspondantes des deux tables
  • left_join() — toutes les lignes de gauche ; NA lorsqu’il n’y a aucune correspondance à droite
  • right_join() — toutes les lignes de droite ; NA lorsqu’il n’y a aucune correspondance à gauche
  • full_join() — toutes les lignes des deux tables ; NA lorsqu’il n’y a aucune correspondance
  • anti_join() — lignes de x SANS correspondance dans y (outil de filtrage)
  • semi_join() — lignes de x AVEC une correspondance dans y (outil de filtrage)
  • Utilisez by = c('x_col' = 'y_col') lorsque les noms de colonnes diffèrent
  • Utilisez un vecteur pour les clés composites : by = c('year', 'quarter')
library(dplyr)

# Chain of joins: the typical real-world pattern
orders <- data.frame(oid=1:3, cid=c(1,2,1), pid=c(10,20,10))
customers <- data.frame(cid=1:2, name=c('Alice','Bob'))
products <- data.frame(pid=c(10,20), name=c('Widget','Gadget'), price=c(9.99,19.99))

orders %>%
  inner_join(customers, by='cid') %>%
  inner_join(products, by='pid', suffix=c('','_product')) %>%
  select(oid, name, name_product, price)

Questions Fréquemment Posées

La leçon « Jointures entre plusieurs tables dans dplyr » est-elle gratuite ?

Oui — le texte complet de « Jointures entre plusieurs tables dans dplyr » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours R Academy, passe à CoddyKit PRO. Le cours R Academy comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Jointures entre plusieurs tables dans dplyr » ?

Maîtrisez inner_join, left_join, right_join, full_join et anti_join. Tu pratiques R Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer R Academy ?

Aucune expérience préalable n'est requise. R Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 3 sur 4.

Combien de temps prend la leçon « Jointures entre plusieurs tables dans dplyr » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon R Academy ?

Oui. Chaque leçon R Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Synthèses groupées et group_by()
  2. Fonctions de fenêtre : lag, lead, cumsum
  3. Jointures entre plusieurs tables dans dplyr
  4. Évaluation tidy : {{ }} et .data
← Retour à R Academy