R Academy · Lektion

Joins på flere tabeller i dplyr

Bliv fortrolig med inner_join, left_join, right_join, full_join og anti_join.

Lektion 3 af 413 trin

Joins på flere tabeller i dplyr er en gratis R Academy-lektion på CoddyKit. Dette er lektion 3 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i R Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. R Academy-kurset indeholder 4 lektioner i alt.

Hvorfor bruge join på tabeller?

Rigtige data findes sjældent i én tabel. Relationelle databaser opdeler oplysninger i flere tabeller for at undgå gentagelser. Join-operationer lader dig kombinere tabeller baseret på fælles nøgler. dplyr stiller join-funktioner i SQL-stil til rådighed med en ren og læsevenlig syntaks.

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() — Kun matchende rækker

inner_join(x, y, by='key') returnerer kun rækker, hvor nøglen findes i begge tabeller. Rækker uden et match i den anden tabel fjernes. Dette er den mest almindelige join-type.

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() — Behold alle rækker til venstre

left_join(x, y, by='key') beholder alle rækker fra x og udfylder matchende data fra y. Rækker i x uden et match i y får NA i y's kolonner. Den venstre tabel styrer resultatet.

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() — Behold alle rækker til højre

right_join(x, y, by='key') beholder alle rækker fra y. Rækker i y uden et match i x får NA i x's kolonner. Det er spejlbilledet af left_join() — mindre almindeligt, eftersom du kan bytte om på tabellernes rækkefølge.

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() — Behold alle rækker

full_join(x, y, by='key') beholder hver eneste række fra begge tabeller. Rækker uden match fra hver af siderne får NA i den anden tabels kolonner. Brug den, når du ikke har råd til at miste data.

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() — Find manglende match

anti_join(x, y, by='key') returnerer rækker i x, som ikke har noget match i y. Ingen kolonner fra y medtages. Den er perfekt til at finde forældreløse poster, ordrer uden match eller elementer, der mangler i en referencetabel.

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() — Filtrér efter match

semi_join(x, y, by='key') returnerer rækker i x, som har et match i y, men tilføjer IKKE y's kolonner. Den fungerer som inner_join(), men returnerer kun x's kolonner — nyttigt som et filtreringstrin.

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

Join med forskellige kolonnenavne

Når nøglekolonnerne har forskellige navne i x og y, skal du bruge syntaksen by = c('x_col' = 'y_col'). Den knytter kolonnenavnet i den venstre tabel til det tilsvarende kolonnenavn i den højre tabel.

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

Join på flere nøgler

Du kan lave join på flere kolonner ved at sende en vektor til by. Alle angivne kolonner skal matche, for at en række kan medtages i join-resultatet. Det håndterer sammensatte nøgler, hvor ingen enkelt kolonne er unik.

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

Kædning af flere join-operationer

Du kan kæde flere join-operationer i en enkelt datapipeline ved hjælp af pipe-operatoren. Opbyg en denormaliseret visning ved trin for trin at tilføje oplysninger fra flere opslagstabeller.

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

Håndtering af duplikerede kolonner

Når begge tabeller har kolonner med samme navn (ud over join-nøglen), tilføjer dplyr suffikserne .x og .y. Du kan tilpasse disse med argumentet suffix og derefter vælge eller omdøbe efter behov.

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

Hurtigt tjek

Hvilken dplyr-join returnerer kun rækker fra den venstre tabel, som ikke har en matchende række i den højre tabel?

Opsummering: dplyr-join

Vigtige pointer om join på flere tabeller i dplyr:

  • inner_join() — kun matchende rækker fra begge tabeller
  • left_join() — alle rækker fra venstre tabel; NA, hvor der ikke er et match i højre tabel
  • right_join() — alle rækker fra højre tabel; NA, hvor der ikke er et match i venstre tabel
  • full_join() — alle rækker fra begge tabeller; NA, hvor der ikke er et match
  • anti_join() — rækker i x uden match i y (filtreringsværktøj)
  • semi_join() — rækker i x med et match i y (filtreringsværktøj)
  • Brug by = c('x_col' = 'y_col') til forskellige kolonnenavne
  • Brug en vektor til sammensatte nøgler: 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)
Gratis at komme i gang

Lær R med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
43
Lektioner
159

Ofte stillede spørgsmål

Er lektionen “Joins på flere tabeller i dplyr” gratis?

Ja — alle 3 lektioner i læringssporet R Academy, inklusive “Joins på flere tabeller i dplyr”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. R Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Joins på flere tabeller i dplyr”?

Bliv fortrolig med inner_join, left_join, right_join, full_join og anti_join. Du øver dig i R Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på R Academy?

Der kræves ingen tidligere erfaring. R Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 3 af 4.

Hvor lang tid tager lektionen “Joins på flere tabeller i dplyr”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne R Academy-lektion?

Ja. Alle R Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Grupperede opsummeringer og group_by()
  2. Vinduesfunktioner: lag, lead, cumsum
  3. Joins på flere tabeller i dplyr
  4. Tidy evaluation: {{ }} og .data
← Tilbage til R Academy