R Academy · Les

Van breed naar lang met pivot_longer()

Vorm tabellen in breed formaat om naar een tidy-indeling in lang formaat voor analyse.

Les 1 van 413 stappen

Van breed naar lang met pivot_longer() is een gratis R Academy-les op CoddyKit. Dit is les 1 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.

Brede versus lange gegevensindeling

Gegevens kunnen worden opgeslagen in een brede indeling (één rij per onderwerp, meerdere waardekolommen) of een lange indeling (één rij per waarneming, één kolom voor de variabelenaam en een andere voor de waarde). Veel R-pakketten voor visualisatie en modellering verwachten de lange indeling.

library(tidyr)
library(dplyr)

# Wide format: each quarter is a column
wide_df <- data.frame(
  student = c('Alice','Bob','Carol'),
  q1 = c(85, 90, 78),
  q2 = c(88, 85, 80),
  q3 = c(92, 88, 84)
)

print(wide_df)
cat('\nShape:', nrow(wide_df), 'rows x', ncol(wide_df), 'cols')

De basis van pivot_longer()

pivot_longer(df, cols, names_to, values_to) zet een brede indeling om in een lange indeling. cols geeft aan welke kolommen moeten worden gedraaid, names_to is de nieuwe kolom voor de oude kolomnamen en values_to is de nieuwe kolom voor de waarden.

library(tidyr)

wide_df <- data.frame(
  student = c('Alice','Bob','Carol'),
  q1 = c(85, 90, 78),
  q2 = c(88, 85, 80),
  q3 = c(92, 88, 84)
)

long_df <- pivot_longer(
  wide_df,
  cols = c(q1, q2, q3),
  names_to = 'quarter',
  values_to = 'score'
)

print(long_df)

Kolommen selecteren met starts_with()

In plaats van kolommen expliciet op te sommen, kun je tidyselect-hulpfuncties binnen cols gebruiken. starts_with('prefix'), ends_with('suffix') en contains('string') zijn vooral handig voor het consistent draaien van kolommen met vergelijkbare namen.

library(tidyr)

df <- data.frame(
  id = 1:3,
  sales_jan = c(100, 200, 150),
  sales_feb = c(120, 180, 160),
  sales_mar = c(130, 190, 170)
)

# Select all sales_ columns automatically
pivot_longer(
  df,
  cols = starts_with('sales_'),
  names_to = 'month',
  values_to = 'sales'
)

Kolommen uitsluiten met -col

Een andere aanpak is om met -col_name op te geven welke kolommen je van het draaien wilt uitsluiten. Alle overige kolommen worden gedraaid. Dit is handig wanneer je slechts één of twee ID-kolommen en veel waardekolommen hebt.

library(tidyr)

df <- data.frame(
  region = c('East','West'),
  jan = c(100, 200),
  feb = c(110, 210),
  mar = c(120, 220),
  apr = c(130, 230)
)

# Pivot everything except 'region'
pivot_longer(df, cols = -region, names_to = 'month', values_to = 'revenue')

names_prefix — Voorvoegsels verwijderen

Wanneer kolomnamen een voorvoegsel hebben, zoals score_q1 en score_q2, verwijdert het argument names_prefix dat voorvoegsel uit de resulterende kolom names_to. Zo blijft de identificatie duidelijk.

library(tidyr)

df <- data.frame(
  id = 1:3,
  score_q1 = c(85, 90, 78),
  score_q2 = c(88, 85, 80),
  score_q3 = c(92, 88, 84)
)

pivot_longer(
  df,
  cols = starts_with('score_'),
  names_to = 'quarter',
  names_prefix = 'score_',
  values_to = 'score'
)

Meerdere kolommensets draaien

Wanneer je meerdere groepen waardekolommen hebt (bijvoorbeeld zowel sales_q1 als cost_q1), gebruik je names_to met meerdere waarden en names_pattern om kolomnamen in onderdelen op te splitsen.

library(tidyr)

df <- data.frame(
  id = 1:2,
  sales_q1 = c(100, 200),
  sales_q2 = c(110, 210),
  cost_q1 = c(60, 110),
  cost_q2 = c(65, 115)
)

pivot_longer(
  df,
  cols = -id,
  names_to = c('.value', 'quarter'),
  names_pattern = '(.+)_(q[0-9]+)'
)

names_transform — Typen converteren

Standaard is de nieuwe kolom met namen van het type tekenreeks. Gebruik names_transform om de namen automatisch naar een ander type te converteren (bijvoorbeeld een geheel jaar uit kolomnamen zoals y2020 en y2021).

library(tidyr)

df <- data.frame(
  product = c('A','B'),
  y2021 = c(100, 200),
  y2022 = c(110, 210),
  y2023 = c(120, 220)
)

result <- pivot_longer(
  df,
  cols = -product,
  names_to = 'year',
  names_prefix = 'y',
  names_transform = list(year = as.integer),
  values_to = 'sales'
)

print(result)
cat('year column type:', class(result$year))

values_drop_na — Ontbrekende waarden verwijderen

Wanneer de brede indeling ontbrekende waarden bevat voor bepaalde kolom-rijcombinaties, verschijnen deze als NA in de lange indeling. Stel values_drop_na = TRUE in om automatisch rijen te verwijderen waarvan de waarde NA is.

library(tidyr)

df <- data.frame(
  student = c('Alice','Bob','Carol'),
  q1 = c(85, NA, 78),
  q2 = c(88, 85, NA),
  q3 = c(NA, 88, 84)
)

# Without drop: 9 rows including NAs
pivot_longer(df, -student, names_to='quarter', values_to='score',
             values_drop_na = TRUE)

De lange indeling maakt ggplot2 mogelijk

De belangrijkste reden om naar een lange indeling om te zetten is dat ggplot2 esthetische eigenschappen uit kolommen haalt. Wanneer alle waarden in één kolom staan en hun categorieën in een andere, kun je moeiteloos color = quarter of facet_wrap(~quarter) gebruiken.

library(tidyr)
# (ggplot2 not run here, but showing the data preparation)

df <- data.frame(
  month = c('Jan','Feb','Mar'),
  product_A = c(100, 120, 110),
  product_B = c(200, 190, 210)
)

# After pivoting, ready for ggplot2:
long_df <- pivot_longer(df, -month, names_to='product', values_to='sales')
print(long_df)
# ggplot(long_df, aes(x=month, y=sales, color=product)) + geom_line()

Draaien met numerieke kolomnamen

Soms bestaan kolomnamen uitsluitend uit cijfers (bijvoorbeeld jaartallen: 2020, 2021). In R worden numerieke kolomnamen in gegevensframes tussen aanhalingstekens geplaatst. Gebruik num_range('', 2020:2023) of backticks in het argument cols om hiermee om te gaan.

library(tidyr)

# Year columns as numbers (common in census-style data)
df <- data.frame(
  country = c('US','UK'),
  '2021' = c(100, 80),
  '2022' = c(110, 85),
  '2023' = c(120, 90),
  check.names = FALSE
)

pivot_longer(
  df,
  cols = c('2021','2022','2023'),
  names_to = 'year',
  values_to = 'gdp_index'
)

Draaieresultaten vergelijken

Controleer na het draaien je resultaat: het aantal rijen moet nrow(wide) * n_pivoted_cols zijn en de unieke waarden in de kolom names_to moeten overeenkomen met de oorspronkelijke kolomnamen (zonder het voorvoegsel als dat is verwijderd).

library(tidyr)

wide <- data.frame(
  id = 1:4,
  jan = c(10,20,30,40),
  feb = c(11,21,31,41),
  mar = c(12,22,32,42)
)

long <- pivot_longer(wide, -id, names_to='month', values_to='value')

cat('Wide rows:', nrow(wide), '\n')
cat('Long rows:', nrow(long), '(expected', nrow(wide)*3, ')\n')
cat('Months:', paste(unique(long$month), collapse=', '), '\n')

Korte controle

Wat doet het argument names_prefix in pivot_longer()?

Samenvatting: pivot_longer()

Belangrijkste punten voor de omzetting van breed naar lang:

  • pivot_longer(df, cols, names_to, values_to) is de kernfunctie
  • cols accepteert tidyselect: starts_with(), -id_col, c('a','b')
  • names_prefix verwijdert een voorlooptekenreeks uit kolomnamen
  • names_transform converteert het type van de namenkolom (bijvoorbeeld naar geheel getal)
  • values_drop_na = TRUE verwijdert automatisch rijen met NA
  • De lange indeling is vereist door ggplot2, de meeste modelleringsfuncties en statistische toetsen
  • Controleer: aantal lange rijen = aantal brede rijen × aantal gedraaide kolommen
library(tidyr)

df <- data.frame(
  team = c('Alpha','Beta'),
  sales_2022 = c(100, 200),
  sales_2023 = c(120, 220),
  sales_2024 = c(140, 240)
)

pivot_longer(
  df,
  cols = starts_with('sales_'),
  names_to = 'year',
  names_prefix = 'sales_',
  names_transform = list(year = as.integer),
  values_to = 'revenue'
)
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 breed naar lang met pivot_longer()” gratis?

Ja — je kunt hier op het web alle 3 lessen van het leerpad R Academy, waaronder “Van breed naar lang met pivot_longer()”, 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 breed naar lang met pivot_longer()”?

Vorm tabellen in breed formaat om naar een tidy-indeling in lang formaat voor analyse. 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 1 van 4.

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

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