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 funkcjacolsakceptuje tidyselect:starts_with(),-id_col,c('a','b')names_prefixusuwa początkowy ciąg znaków z nazw kolumnnames_transformzmienia typ kolumny z nazwami (np. na integer)values_drop_na = TRUEautomatycznie 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
- Z układu szerokiego do długiego za pomocą pivot_longer()
- Z układu długiego do szerokiego za pomocą pivot_wider()
- separate() i unite() dla kolumn tekstowych
- Zagnieżdżanie i rozpakowywanie ramek danych