R Academy · Les

Van lang naar breed met pivot_wider()

Zet sleutel-waardekoppels terug om naar tabellen in breed formaat.

Les 2 van 413 stappen

Van lang naar breed met pivot_wider() is een gratis R Academy-les op CoddyKit. Dit is les 2 van 4. Je kunt 3 lessen uit dit leerpad gratis volledig lezen — daarna ontgrendelt CoddyKit PRO alle lessen, plus praktische oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject R Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus R Academy bevat in totaal 4 lessen.

Wanneer je breed gaat

Hoewel de lange indeling geschikt is voor analyse, heb je de brede indeling vaak nodig voor rapporten, spreadsheets en bepaalde algoritmen (zoals correlatiematrices). pivot_wider() is het omgekeerde van pivot_longer() — de functie verspreidt waarden uit één kolom over meerdere nieuwe kolommen.

library(tidyr)

# Long format: one row per student-quarter combination
long_df <- data.frame(
  student = c('Alice','Alice','Alice','Bob','Bob','Bob'),
  quarter = c('Q1','Q2','Q3','Q1','Q2','Q3'),
  score = c(85, 88, 92, 90, 85, 88)
)

print(long_df)
cat('\n', nrow(long_df), 'rows x', ncol(long_df), 'cols')

De basis van pivot_wider()

pivot_wider(df, names_from, values_from) zet een lange indeling om in een brede indeling. names_from geeft de kolom aan waarvan de waarden nieuwe kolomnamen worden; values_from geeft de kolom aan waarvan de waarden deze nieuwe kolommen vullen.

library(tidyr)

long_df <- data.frame(
  student = c('Alice','Alice','Alice','Bob','Bob','Bob'),
  quarter = c('Q1','Q2','Q3','Q1','Q2','Q3'),
  score = c(85, 88, 92, 90, 85, 88)
)

wide_df <- pivot_wider(
  long_df,
  names_from = quarter,
  values_from = score
)

print(wide_df)

id_cols — Rijsleutels identificeren

id_cols geeft aan welke kolommen elke rij in de brede uitvoer uniek identificeren. Standaard gebruikt dplyr alle kolommen die niet in names_from of values_from zijn opgegeven. Door dit expliciet in te stellen voorkom je onverwachte groepering.

library(tidyr)

df <- data.frame(
  year = c(2023,2023,2024,2024),
  region = c('East','West','East','West'),
  quarter = c('Q1','Q1','Q1','Q1'),
  revenue = c(100, 200, 120, 220)
)

pivot_wider(
  df,
  id_cols = c(year, quarter),
  names_from = region,
  values_from = revenue
)

values_fill — Omgaan met ontbrekende combinaties

Wanneer sommige combinaties van id_cols en names_from niet bestaan, zou de resulterende cel NA zijn. Gebruik values_fill om deze ontbrekende waarden te vervangen door een standaardwaarde, bijvoorbeeld 0 voor aantallen of sommen.

library(tidyr)

df <- data.frame(
  product = c('A','A','B'),
  channel = c('online','store','online'),
  sales = c(100, 150, 200)
)

# 'B' has no 'store' data — fill with 0
pivot_wider(
  df,
  names_from = channel,
  values_from = sales,
  values_fill = 0
)

names_prefix — Voorvoegsels toevoegen

Gebruik names_prefix om aan alle nieuwe kolomnamen een tekenreeks vooraf te laten gaan. Zo voorkom je problemen wanneer de waarden in names_from getallen zijn of wanneer je kolomnamen beschrijvender wilt maken.

library(tidyr)

df <- data.frame(
  student = c('Alice','Alice','Bob','Bob'),
  quarter = c(1, 2, 1, 2),
  score = c(85, 90, 78, 82)
)

# Without prefix: columns named '1' and '2' (problematic)
# With prefix: q1, q2
pivot_wider(
  df,
  names_from = quarter,
  values_from = score,
  names_prefix = 'q'
)

Meerdere kolommen in values_from

Je kunt meerdere waardekolommen tegelijk omvormen door een vector aan values_from door te geven. De resulterende kolommen krijgen namen volgens value_name, waarbij de naam van de waardekolom en de categorie worden gecombineerd.

library(tidyr)

df <- data.frame(
  region = c('East','East','West','West'),
  period = c('Q1','Q2','Q1','Q2'),
  revenue = c(100, 120, 200, 210),
  units = c(10, 12, 20, 22)
)

pivot_wider(
  df,
  names_from = period,
  values_from = c(revenue, units)
)

Duplicaten verwerken met values_fn

Als er meerdere waarden zijn voor dezelfde combinatie van id + name, weet pivot_wider niet welke waarde moet worden gebruikt en retourneert deze een lijstkolom met een waarschuwing. Gebruik values_fn om dit op te lossen door een aggregatiefunctie op te geven.

library(tidyr)

# Duplicate rows: Alice has two Q1 scores
df <- data.frame(
  student = c('Alice','Alice','Alice','Bob','Bob'),
  quarter = c('Q1','Q1','Q2','Q1','Q2'),
  score = c(85, 87, 90, 78, 82)
)

# Resolve duplicates by taking the mean
pivot_wider(
  df,
  names_from = quarter,
  values_from = score,
  values_fn = mean
)

values_fn met een benoemde lijst

Geef een benoemde lijst door aan values_fn om tegelijkertijd verschillende aggregatiefuncties op verschillende waardekolommen toe te passen. Dit is krachtig wanneer je meerdere waardekolommen omvormt waarvoor verschillende samenvattingsmethoden nodig zijn.

library(tidyr)

df <- data.frame(
  region = c('East','East','West','West'),
  period = c('Q1','Q1','Q1','Q1'),
  revenue = c(100, 120, 200, 210),
  orders = c(10, 12, 20, 22)
)

pivot_wider(
  df,
  names_from = period,
  values_from = c(revenue, orders),
  values_fn = list(revenue = sum, orders = sum)
)

Kruistabellen maken

Je maakt eenvoudig een kruistabel (contingentietabel) in de vorm van een data frame met pivot_wider(), nadat je de gegevens hebt geteld met dplyr::count(). Zo combineer je de kracht van beide pakketten voor frequentieanalyse.

library(tidyr)
library(dplyr)

survey <- data.frame(
  dept = c('HR','HR','Eng','Eng','HR','Eng'),
  response = c('Yes','No','Yes','Yes','Yes','No')
)

survey %>%
  count(dept, response) %>%
  pivot_wider(
    names_from = response,
    values_from = n,
    values_fill = 0
  )

Heen-en-terug: lang → breed → lang

Als je de inverse relatie tussen pivot_longer() en pivot_wider() begrijpt, kun je fouten opsporen. Een heen-en-terugbewerking (lang->breed->lang) hoort de oorspronkelijke gegevens terug te geven, afgezien van de volgorde van de rijen en typeconversies.

library(tidyr)

original_long <- data.frame(
  id = c(1,1,2,2),
  key = c('a','b','a','b'),
  value = c(10, 20, 30, 40)
)

# Go wide
wide <- pivot_wider(original_long, names_from=key, values_from=value)
print(wide)

# Go long again
pivot_longer(wide, -id, names_to='key', values_to='value')

Praktijk: rapport met scores

Een typisch gebruiksscenario: neem een lange tabel met testscores en vorm deze om tot een rapporttabel met leerlingen per vak. Combineer dit met dplyr::arrange() en rename() om overzichtelijke uitvoer te maken die klaar is voor presentatie.

library(tidyr)
library(dplyr)

scores <- data.frame(
  student = c('Alice','Alice','Bob','Bob','Carol','Carol'),
  subject = c('Math','Science','Math','Science','Math','Science'),
  score = c(92, 88, 85, 91, 79, 83)
)

scores %>%
  pivot_wider(names_from=subject, values_from=score) %>%
  mutate(average = round((Math + Science) / 2, 1)) %>%
  arrange(desc(average))

Korte controle

Wat gebeurt er wanneer je pivot_wider() aanroept en er meerdere waarden zijn voor dezelfde combinatie van id + name?

Samenvatting: pivot_wider()

Belangrijkste punten voor de omzetting van lang naar breed:

  • pivot_wider(names_from, values_from) spreidt een sleutelkolom uit over meerdere nieuwe kolommen
  • id_cols geeft aan welke kolommen elke rij identificeren
  • values_fill = 0 (of een andere scalaire waarde) vult ontbrekende combinaties op
  • names_prefix zet een tekenreeks vooraan om numerieke of dubbelzinnige kolomnamen te voorkomen
  • values_fn lost dubbele celwaarden op met een aggregatiefunctie
  • Geef een vector door aan values_from om meerdere waardekolommen tegelijk om te vormen
  • Gebruik dit na count() om efficiënt kruistabellen te maken
library(tidyr)
library(dplyr)

data.frame(
  region = c('East','East','West','West'),
  metric = c('revenue','units','revenue','units'),
  value = c(100, 10, 200, 20)
) %>%
  pivot_wider(
    names_from = metric,
    values_from = value,
    values_fill = 0
  ) %>%
  mutate(revenue_per_unit = revenue / units)
Gratis beginnen

Leer R met een AI-tutor — gratis

Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.

Cursussen
43
Lessen
159

Veelgestelde vragen

Is de les “Van lang naar breed met pivot_wider()” gratis?

Ja — je kunt hier op het web alle 3 lessen van het leerpad R Academy, waaronder “Van lang naar breed met pivot_wider()”, gratis volledig lezen. Daarna ontgrendelt CoddyKit PRO alle lessen, plus interactieve oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. De cursus R Academy bevat in totaal 4 lessen.

Wat leer ik in “Van lang naar breed met pivot_wider()”?

Zet sleutel-waardekoppels terug om naar tabellen in breed formaat. Je oefent met R Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.

Heb ik ervaring nodig om met R Academy te beginnen?

Ervaring vooraf is niet nodig. R Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 2 van 4.

Hoe lang duurt de les “Van lang naar breed met pivot_wider()”?

De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.

Kan ik code schrijven en uitvoeren in deze les over R Academy?

Ja. Elke les over R Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.

Alle lessen in deze cursus

  1. Van breed naar lang met pivot_longer()
  2. Van lang naar breed met pivot_wider()
  3. separate() en unite() voor stringkolommen
  4. Data frames nesten en ontvouwen
← Terug naar R Academy