R Academy · Lektion

Fra langt til bredt format med pivot_wider()

Fold key-value-par ud til tabeller i bredt format igen.

Lektion 2 af 413 trin

Fra langt til bredt format med pivot_wider() er en gratis R Academy-lektion på CoddyKit. Dette er lektion 2 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.

Hvornår skal du bruge bredt format?

Selvom langt format egner sig til analyse, er bredt format ofte nødvendigt til rapporter, regneark og bestemte algoritmer (f.eks. korrelationsmatricer). pivot_wider() er den omvendte funktion af pivot_longer() — den spreder værdier fra én kolonne ud i 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')

Grundlæggende brug af pivot_wider()

pivot_wider(df, names_from, values_from) konverterer langt format til bredt format. names_from angiver den kolonne, hvis værdier bliver til nye kolonnenavne; values_from angiver den kolonne, hvis værdier udfylder de nye kolonner.

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 — Identifikation af rækkenøgler

id_cols angiver, hvilke kolonner der entydigt identificerer hver række i det brede output. Som standard bruger dplyr alle kolonner, der ikke er angivet i names_from eller values_from. Ved at angive dette eksplicit undgå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 af manglende kombinationer

Når nogle kombinationer af id_cols og names_from ikke findes, bliver den resulterende celle NA. Brug values_fill til at erstatte de manglende værdier med en standardværdi, f.eks. 0 for optællinger 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 — Tilføjelse af præfikser

Brug names_prefix til at sætte en tekststreng foran alle nye kolonnenavne. Det undgår problemer, når værdierne i names_from er tal, eller når du vil gøre kolonnenavnene mere 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

Du kan pivotere flere værdikolonner på én gang ved at sende en vektor til values_from. De resulterende kolonner navngives som value_name ved at kombinere værdikolonnens navn og 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åndtering af dubletter med values_fn

Hvis der er flere værdier for den samme id + name-kombination, ved pivot_wider ikke, hvilken der skal bruges, og returnerer en list-column med en advarsel. Brug values_fn til at løse dette ved at angive en aggregeringsfunktion.

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 navngivet liste

Send en navngivet liste til values_fn for samtidig at anvende forskellige aggregeringsfunktioner på forskellige værdikolonner. Det er nyttigt, når du pivoterer flere værdikolonner, som kræver forskellige opsummeringsmetoder.

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

Oprettelse af krydstabeller

En krydstabel (kontingenstabel) i data frame-format kan nemt oprettes med pivot_wider() efter optælling med dplyr::count(). Det kombinerer styrken fra begge pakker til 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
  )

Rundtur: Langt format -> Bredt format -> Langt format

Hvis du forstår det omvendte forhold mellem pivot_longer() og pivot_wider(), bliver det lettere at opdage fejl. En rundtur (langt format->bredt format->langt format) bør returnere de oprindelige data, bortset fra rækkefø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 eksempel: Resultatrapport

Et typisk anvendelsesområde er at tage en tabel med prøveresultater i langt format og omforme den til en rapporttabel med elever efter fag. Kombinér med dplyr::arrange() og rename() for at skabe et rent output, der er klar til præsentation.

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

Hurtigt tjek

Hvad sker der, når du kalder pivot_wider(), og der er flere værdier for den samme id + name-kombination?

Opsummering: pivot_wider()

Vigtige pointer om konvertering fra langt til bredt format:

  • pivot_wider(names_from, values_from) spreder en nøglekolonne ud i flere nye kolonner
  • id_cols angiver, hvilke kolonner der identificerer hver række
  • values_fill = 0 (eller en anden skalær) udfylder manglende kombinationer
  • names_prefix sætter en tekststreng foran for at undgå numeriske eller tvetydige kolonnenavne
  • values_fn håndterer dublerede celleværdier med en aggregeringsfunktion
  • Send en vektor til values_from for at pivotere flere værdikolonner samtidig
  • Brug den efter count() til effektivt at opbygge krydstabeller
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 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 “Fra langt til bredt format med pivot_wider()” gratis?

Ja — alle 3 lektioner i læringssporet R Academy, inklusive “Fra langt til bredt format med pivot_wider()”, 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 “Fra langt til bredt format med pivot_wider()”?

Fold key-value-par ud til tabeller i bredt format igen. 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 2 af 4.

Hvor lang tid tager lektionen “Fra langt til bredt format med pivot_wider()”?

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. Fra bredt til langt format med pivot_longer()
  2. Fra langt til bredt format med pivot_wider()
  3. separate() og unite() til strengkolonner
  4. Indlejring og udpakning af data frames
← Tilbage til R Academy