Van breed naar lang met pivot_longer()
Vorm tabellen in breed formaat om naar een tidy-indeling in lang formaat voor analyse.
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 kernfunctiecolsaccepteert tidyselect:starts_with(),-id_col,c('a','b')names_prefixverwijdert een voorlooptekenreeks uit kolomnamennames_transformconverteert het type van de namenkolom (bijvoorbeeld naar geheel getal)values_drop_na = TRUEverwijdert 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'
)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
- Van breed naar lang met pivot_longer()
- Van lang naar breed met pivot_wider()
- separate() en unite() voor stringkolommen
- Data frames nesten en ontvouwen