Joins über mehrere Tabellen in dplyr
Beherrschen Sie inner_join, left_join, right_join, full_join und anti_join.
Joins über mehrere Tabellen in dplyr ist eine kostenlose R Academy-Lektion auf CoddyKit. Dies ist Lektion 3 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des R Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der R Academy-Kurs umfasst insgesamt 4 Lektionen.
Warum Tabellen verknüpfen?
Reale Daten befinden sich selten in einer einzigen Tabelle. Relationale Datenbanken verteilen Informationen auf mehrere Tabellen, um Wiederholungen zu vermeiden. Mit Joins können Sie Tabellen anhand gemeinsamer Schlüssel kombinieren. dplyr stellt Join-Funktionen im SQL-Stil mit einer übersichtlichen, gut lesbaren Syntax bereit.
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() — Nur übereinstimmende Zeilen
inner_join(x, y, by='key') gibt nur Zeilen zurück, bei denen der Schlüssel in beiden Tabellen vorhanden ist. Zeilen ohne Übereinstimmung in der jeweils anderen Tabelle werden entfernt. Dies ist der am häufigsten verwendete Join-Typ.
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() — Alle linken Zeilen beibehalten
left_join(x, y, by='key') behält alle Zeilen aus x bei und ergänzt übereinstimmende Daten aus y. Zeilen in x ohne Übereinstimmung in y erhalten für die Spalten von y den Wert NA. Die linke Tabelle bestimmt das Ergebnis.
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() — Alle rechten Zeilen beibehalten
right_join(x, y, by='key') behält alle Zeilen aus y bei. Zeilen in y ohne Übereinstimmung in x erhalten für die Spalten von x den Wert NA. Dies ist das Gegenstück zu left_join() — weniger gebräuchlich, da Sie einfach die Reihenfolge der Tabellen vertauschen können.
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() — Alle Zeilen beibehalten
full_join(x, y, by='key') behält jede Zeile aus beiden Tabellen bei. Nicht übereinstimmende Zeilen von beiden Seiten erhalten für die Spalten der jeweils anderen Tabelle den Wert NA. Verwenden Sie diese Funktion, wenn Sie keine Daten verlieren dürfen.
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() — Nicht übereinstimmende Zeilen finden
anti_join(x, y, by='key') gibt die Zeilen in x zurück, für die es keine Übereinstimmung in y gibt. Spalten aus y werden nicht einbezogen. Die Funktion eignet sich ideal, um verwaiste Datensätze, nicht zugeordnete Bestellungen oder in einer Referenztabelle fehlende Elemente zu finden.
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() — Nach Übereinstimmungen filtern
semi_join(x, y, by='key') gibt die Zeilen in x zurück, für die es eine Übereinstimmung in y gibt, fügt jedoch keine Spalten aus y hinzu. Die Funktion ähnelt inner_join(), gibt aber nur die Spalten aus x zurück — nützlich als Filterschritt.
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')Verknüpfung mit unterschiedlichen Spaltennamen
Wenn die Schlüsselspalten in x und y unterschiedliche Namen haben, verwenden Sie die Syntax by = c('x_col' = 'y_col'). Damit wird der Spaltenname in der linken Tabelle der entsprechenden Spalte in der rechten Tabelle zugeordnet.
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'))Verknüpfung über mehrere Schlüssel
Sie können über mehrere Spalten verknüpfen, indem Sie einen Vektor an by übergeben. Alle angegebenen Spalten müssen übereinstimmen, damit eine Zeile verknüpft wird. So lassen sich zusammengesetzte Schlüssel verarbeiten, bei denen keine einzelne Spalte eindeutig ist.
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'))Mehrere Joins verketten
Sie können mehrere Joins in einer einzigen Pipeline mithilfe des Pipe-Operators verketten. Erstellen Sie schrittweise eine denormalisierte Sicht, indem Sie aus mehreren Nachschlagetabellen nacheinander Informationen hinzufügen.
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')Doppelte Spalten behandeln
Wenn beide Tabellen Spalten mit demselben Namen haben (abgesehen vom Join-Schlüssel), fügt dplyr die Suffixe .x und .y hinzu. Mit dem Argument suffix können Sie diese anpassen und die Spalten anschließend auswählen oder umbenennen.
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))Schnelltest
Welcher dplyr-Join gibt nur Zeilen aus der linken Tabelle zurück, für die es keine übereinstimmende Zeile in der rechten Tabelle gibt?
Zusammenfassung: dplyr-Joins
Die wichtigsten Punkte zu Joins über mehrere Tabellen in dplyr:
inner_join()— nur übereinstimmende Zeilen aus beiden Tabellenleft_join()— alle Zeilen aus der linken Tabelle; NA ohne Übereinstimmung in der rechten Tabelleright_join()— alle Zeilen aus der rechten Tabelle; NA ohne Übereinstimmung in der linken Tabellefull_join()— alle Zeilen aus beiden Tabellen; NA ohne Übereinstimmunganti_join()— Zeilen in x ohne Übereinstimmung in y (Filterwerkzeug)semi_join()— Zeilen in x mit Übereinstimmung in y (Filterwerkzeug)- Verwenden Sie
by = c('x_col' = 'y_col')bei unterschiedlichen Spaltennamen - Verwenden Sie einen Vektor für zusammengesetzte Schlüssel:
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)Lerne R mit einem KI-Tutor — kostenlos
Schreibe und führe echten Code in deinem Browser aus, bekomme sofortige Hilfe von einem 24/7 KI-Tutor und setze dein Lernen im Web oder in der App fort.
- Kurse
- 43
- Lektionen
- 159
Häufig gestellte Fragen
Ist die Lektion „Joins über mehrere Tabellen in dplyr“ kostenlos?
Ja — der vollständige Text von „Joins über mehrere Tabellen in dplyr“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des R Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der R Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Joins über mehrere Tabellen in dplyr“?
Beherrschen Sie inner_join, left_join, right_join, full_join und anti_join. Du übst R Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um R Academy zu starten?
Keine Vorkenntnisse erforderlich. R Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 3 von 4.
Wie lange dauert die Lektion „Joins über mehrere Tabellen in dplyr“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser R Academy-Lektion Code schreiben und ausführen?
Ja. Jede R Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Gruppierte Zusammenfassungen und group_by()
- Window-Funktionen: lag, lead, cumsum
- Joins über mehrere Tabellen in dplyr
- Tidy Evaluation: {{ }} und .data