R Academy · leksjon

Fra langt til bredt med pivot_wider()

Gjør nøkkel-verdi-par om til tabeller i bredt format igjen.

Leksjon 2 av 413 trinn

Fra langt til bredt med pivot_wider() er en gratis leksjon i R Academy på CoddyKit. Dette er leksjon 2 av 4. Du kan lese valgfritt 3 leksjoner fra denne læringsstien gratis i sin helhet – deretter låser CoddyKit PRO opp alle leksjoner, samt praktisk øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i R Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i R Academy inneholder totalt 4 leksjoner.

Når du bør bruke bredt format

Selv om langt format egner seg godt til analyse, trengs bredt format ofte til rapporter, regneark og enkelte algoritmer (for eksempel korrelasjonsmatriser). pivot_wider() er det omvendte av pivot_longer() — den sprer verdier fra én kolonne til flere nye kolonner.

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

Grunnleggende om pivot_wider()

pivot_wider(df, names_from, values_from) konverterer langt format til bredt format. names_from angir kolonnen hvis verdier skal bli nye kolonnenavn, mens values_from angir kolonnen hvis verdier skal fylle de nye kolonnene.

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 — Identifisere radnøkler

id_cols angir hvilke kolonner som entydig identifiserer hver rad i det brede resultatet. Som standard bruker dplyr alle kolonner som ikke er angitt i names_from eller values_from. Ved å angi dette eksplisitt unngår du uventet gruppering.

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 — Håndtering av manglende kombinasjoner

Når enkelte kombinasjoner av id_cols og names_from ikke finnes, blir den tilsvarende cellen NA. Bruk values_fill til å erstatte disse manglende verdiene med en standardverdi, for eksempel 0 for antall eller summer.

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 — Legge til prefikser

Bruk names_prefix til å sette en tekst foran alle nye kolonnenavn. Dette unngår problemer når verdiene i names_from er tall, eller når De vil gjøre kolonnenavnene mer beskrivende.

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

Flere values_from-kolonner

De kan pivotere flere verdikolonner samtidig ved å sende en vektor til values_from. De resulterende kolonnene navngis som value_name ved å kombinere navnet på verdikolonnen med kategorien.

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

Håndtere duplikater med values_fn

Hvis det finnes flere verdier for den samme id + name-kombinasjonen, vet ikke pivot_wider hvilken verdi som skal brukes, og returnerer en listekolonne med en advarsel. Bruk values_fn til å løse dette ved å angi en aggregeringsfunksjon.

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 med en navngitt liste

Send en navngitt liste til values_fn for å bruke ulike aggregeringsfunksjoner på forskjellige verdikolonner samtidig. Dette er nyttig når De pivoterer flere verdikolonner som trenger ulike sammendragsmetoder.

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

Opprette krysstabeller

En krysstabell (kontingenstabell) i data frame-format kan enkelt opprettes med pivot_wider() etter opptelling med dplyr::count(). Dette kombinerer styrken til begge pakkene for frekvensanalyse.

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
  )

Tur-retur: Lang → Bred → Lang

Det er nyttig å forstå det omvendte forholdet mellom pivot_longer() og pivot_wider() for å oppdage feil. En tur-retur-konvertering (lang→bred→lang) bør gi tilbake de opprinnelige dataene, med unntak av radrekkefølge og typekonverteringer.

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

Praktisk: resultatrapport

Et typisk bruksområde er å ta en lang tabell med testresultater og omforme den til en rapporttabell med elever etter fag. Kombiner med dplyr::arrange() og rename() for å lage et ryddig resultat som er klart til presentasjon.

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

Hurtigsjekk

Hva skjer når De kaller pivot_wider() og det finnes flere verdier for den samme id + name-kombinasjonen?

Oppsummering: pivot_wider()

Viktigste punkter ved konvertering fra lang til bred:

  • pivot_wider(names_from, values_from) sprer en nøkkelkolonne over flere nye kolonner
  • id_cols angir hvilke kolonner som identifiserer hver rad
  • values_fill = 0 (eller en annen skalar) fyller ut manglende kombinasjoner
  • names_prefix setter en tekst foran for å unngå numeriske eller tvetydige kolonnenavn
  • values_fn løser dupliserte celleverdier med en aggregeringsfunksjon
  • Send en vektor til values_from for å pivotere flere verdikolonner samtidig
  • Brukes etter count() for å bygge krysstabeller effektivt
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 å komme i gang

Lær deg R med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
43
Leksjoner
159

Ofte stilte spørsmål

Er leksjonen «Fra langt til bredt med pivot_wider()» gratis?

Ja – du kan lese valgfritt 3 av leksjonene i læringsstien R Academy, inkludert «Fra langt til bredt med pivot_wider()», gratis i sin helhet her på nettet. Deretter låser CoddyKit PRO opp alle leksjoner, samt interaktiv øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Kurset i R Academy inneholder totalt 4 leksjoner.

Hva lærer jeg i «Fra langt til bredt med pivot_wider()»?

Gjør nøkkel-verdi-par om til tabeller i bredt format igjen. Du øver på R Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med R Academy?

Ingen tidligere erfaring er nødvendig. R Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 2 av 4.

Hvor lang tid tar leksjonen «Fra langt til bredt med pivot_wider()»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne R Academy-leksjonen?

Ja. Alle R Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. Fra bredt til langt med pivot_longer()
  2. Fra langt til bredt med pivot_wider()
  3. separate() og unite() for tekstkolonner
  4. Nestede og unnestede data frames
← Tilbake til R Academy