0Pricing
R Academy · Lekcja

Z układu szerokiego do długiego za pomocą pivot_longer()

Przekształcaj tabele w układzie szerokim do uporządkowanego układu długiego na potrzeby analizy.

Z układu szerokiego do długiego za pomocą pivot_longer() to bezpłatna lekcja R Academy na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej R Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs R Academy zawiera 4 lekcji w sumie.

Szeroki a długi format danych

Dane można przechowywać w szerokim formacie (jeden wiersz na obiekt, wiele kolumn z wartościami) albo w długim formacie (jeden wiersz na obserwację, jedna kolumna z nazwą zmiennej i druga z jej wartością). Wiele pakietów R do wizualizacji i modelowania oczekuje długiego formatu.

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

Podstawy pivot_longer()

pivot_longer(df, cols, names_to, values_to) przekształca format szeroki w długi. cols określa kolumny do przekształcenia, names_to to nowa kolumna na dawne nazwy kolumn, a values_to to nowa kolumna na wartości.

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)

Wybieranie kolumn za pomocą starts_with()

Zamiast wymieniać kolumny jawnie, użyj pomocników tidyselect wewnątrz cols. starts_with('prefix'), ends_with('suffix') i contains('string') są szczególnie przydatne podczas spójnego przekształcania kolumn o podobnych nazwach.

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

Wykluczanie kolumn za pomocą -col

Inne podejście polega na określeniu kolumn, które mają zostać wykluczone z przekształcania, za pomocą -col_name. Wszystkie pozostałe kolumny zostaną przekształcone. Jest to wygodne, gdy masz tylko jedną lub dwie kolumny identyfikatorów i wiele kolumn z wartościami.

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 — usuwanie prefiksów

Gdy nazwy kolumn mają prefiks, na przykład score_q1 i score_q2, argument names_prefix usuwa ten prefiks z wynikowej kolumny names_to. Dzięki temu identyfikator pozostaje przejrzysty.

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

Przekształcanie wielu zestawów kolumn

Gdy masz wiele grup kolumn z wartościami (np. zarówno sales_q1, jak i cost_q1), użyj names_to z wieloma wartościami oraz names_pattern, aby podzielić nazwy kolumn na części.

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 — konwertowanie typów

Domyślnie nowa kolumna z nazwami ma typ znakowy. Użyj names_transform, aby automatycznie przekonwertować ją na inny typ (np. uzyskać rok typu integer z nazw kolumn takich jak y2020 i 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 — usuwanie brakujących wartości

Gdy w szerokim formacie brakuje wartości dla niektórych kombinacji kolumn i wierszy, w długim formacie pojawiają się one jako NA. Ustaw values_drop_na = TRUE, aby automatycznie usunąć wiersze, w których wartość to NA.

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)

Długi format umożliwia pracę z ggplot2

Najważniejszy powód przekształcania danych do długiego formatu jest taki, że ggplot2 mapuje estetyki na podstawie kolumn. Gdy wszystkie wartości znajdują się w jednej kolumnie, a ich kategorie w drugiej, możesz bez trudu użyć color = quarter lub facet_wrap(~quarter).

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

Przekształcanie kolumn o nazwach numerycznych

Czasami nazwy kolumn są czystymi liczbami (np. latami: 2020, 2021). W R numeryczne nazwy kolumn w ramkach danych zapisuje się w cudzysłowie. Użyj num_range('', 2020:2023) lub zapisu w backtickach w argumencie cols, aby je obsłużyć.

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

Porównywanie wyników pivotowania

Po przekształceniu sprawdź wynik: liczba wierszy powinna wynosić nrow(wide) * n_pivoted_cols, a unikatowe wartości w kolumnie names_to powinny odpowiadać pierwotnym nazwom kolumn (pomniejszonym o prefiks, jeśli został usunięty).

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

Szybkie sprawdzenie

Co robi argument names_prefix w funkcji pivot_longer()?

Podsumowanie: pivot_longer()

Najważniejsze informacje o konwersji z formatu szerokiego do długiego:

  • pivot_longer(df, cols, names_to, values_to) to podstawowa funkcja
  • cols akceptuje tidyselect: starts_with(), -id_col, c('a','b')
  • names_prefix usuwa początkowy ciąg znaków z nazw kolumn
  • names_transform zmienia typ kolumny z nazwami (np. na integer)
  • values_drop_na = TRUE automatycznie usuwa wiersze z NA
  • Długi format jest wymagany przez ggplot2, większość funkcji modelowania i testy statystyczne
  • Sprawdzenie: liczba wierszy w długim formacie = liczba wierszy w szerokim formacie × liczba przekształcanych kolumn
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'
)

Często zadawane pytania

Czy lekcja „Z układu szerokiego do długiego za pomocą pivot_longer()” jest bezpłatna?

Tak — pełny tekst „Z układu szerokiego do długiego za pomocą pivot_longer()” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu R Academy, przejdź na CoddyKit PRO. Kurs R Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Z układu szerokiego do długiego za pomocą pivot_longer()”?

Przekształcaj tabele w układzie szerokim do uporządkowanego układu długiego na potrzeby analizy. Ćwiczysz R Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć R Academy?

Nie wymagamy żadnego doświadczenia. R Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.

Ile czasu zajmuje lekcja „Z układu szerokiego do długiego za pomocą pivot_longer()”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji R Academy?

Tak. Każda lekcja R Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Z układu szerokiego do długiego za pomocą pivot_longer()
  2. Z układu długiego do szerokiego za pomocą pivot_wider()
  3. separate() i unite() dla kolumn tekstowych
  4. Zagnieżdżanie i rozpakowywanie ramek danych
← Powrót do R Academy