Z układu długiego do szerokiego za pomocą pivot_wider()
Przekształcaj pary klucz-wartość z powrotem w tabele w układzie szerokim.
Z układu długiego do szerokiego za pomocą pivot_wider() to bezpłatna lekcja R Academy na CoddyKit. To lekcja 2 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.
Kiedy używać szerokiego formatu
Chociaż długi format dobrze sprawdza się w analizie, szeroki format jest często potrzebny w raportach, arkuszach kalkulacyjnych i niektórych algorytmach (np. macierzach korelacji). pivot_wider() jest odwrotnością pivot_longer() — rozdziela wartości z jednej kolumny na wiele nowych kolumn.
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')Podstawy pivot_wider()
pivot_wider(df, names_from, values_from) przekształca format długi w szeroki. names_from określa kolumnę, której wartości staną się nazwami nowych kolumn; values_from określa kolumnę, której wartości wypełnią te nowe kolumny.
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 — identyfikowanie kluczy wierszy
id_cols określa kolumny, które jednoznacznie identyfikują każdy wiersz w szerokim wyniku. Domyślnie dplyr używa wszystkich kolumn, które nie zostały określone w names_from ani values_from. Jawne ustawienie tego argumentu zapobiega nieoczekiwanemu grupowaniu.
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 — Obsługa brakujących kombinacji
Gdy niektóre kombinacje id_cols i names_from nie istnieją, wynikowa komórka będzie zawierać NA. Należy użyć values_fill, aby zastąpić brakujące wartości domyślną wartością (np. 0 w przypadku zliczeń lub sum).
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 — Dodawanie prefiksów
Należy użyć names_prefix, aby dodać ciąg znaków na początku wszystkich nowych nazw kolumn. Zapobiega to problemom, gdy wartości w names_from są liczbami lub gdy nazwy kolumn mają być bardziej opisowe.
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'
)Wiele kolumn values_from
Można jednocześnie przekształcać wiele kolumn wartości, przekazując wektor do values_from. Kolumny wynikowe otrzymują nazwy w postaci value_name, łączące nazwę kolumny wartości z kategorią.
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)
)Obsługa duplikatów za pomocą values_fn
Jeśli dla tej samej kombinacji id + name istnieje wiele wartości, pivot_wider nie wie, której użyć, i zwraca kolumnę listową wraz z ostrzeżeniem. Należy użyć values_fn, aby rozwiązać ten problem, wskazując funkcję agregującą.
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 z nazwaną listą
Należy przekazać nazwaną listę do values_fn, aby jednocześnie zastosować różne funkcje agregujące do różnych kolumn wartości. Jest to szczególnie przydatne podczas przekształcania wielu kolumn wartości, które wymagają różnych metod podsumowania.
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)
)Tworzenie tabulacji krzyżowych
Tabulację krzyżową (tablicę kontyngencji) w postaci ramki danych można łatwo utworzyć za pomocą pivot_wider() po zliczeniu danych funkcją dplyr::count(). Łączy to możliwości obu pakietów na potrzeby analizy częstości.
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
)Pełny cykl: long -> wide -> long
Zrozumienie odwrotnej zależności między pivot_longer() i pivot_wider() pomaga wykrywać błędy. Pełny cykl (long->wide->long) powinien zwrócić oryginalne dane (z pominięciem kolejności wierszy i konwersji typów).
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')Praktyczny przykład: raport wyników
Typowy przypadek użycia: przekształcenie długiej tabeli wyników testów w tabelę raportową w układzie uczniowie według przedmiotów. Połączenie z dplyr::arrange() i rename() pozwala uzyskać przejrzysty wynik gotowy do prezentacji.
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))Szybkie sprawdzenie
Co się stanie po wywołaniu pivot_wider(), jeśli dla tej samej kombinacji id + name istnieje wiele wartości?
Podsumowanie: pivot_wider()
Najważniejsze informacje dotyczące konwersji z układu długiego do szerokiego:
pivot_wider(names_from, values_from)rozmieszcza kolumnę klucza w wielu nowych kolumnachid_colsokreśla kolumny identyfikujące każdy wierszvalues_fill = 0(lub dowolna wartość skalarna) uzupełnia brakujące kombinacjenames_prefixdodaje ciąg znaków na początku nazwy, aby uniknąć numerycznych lub niejednoznacznych nazw kolumnvalues_fnrozwiązuje problem zduplikowanych wartości w komórkach za pomocą funkcji agregującej- Przekazanie wektora do
values_fromumożliwia jednoczesne przekształcenie wielu kolumn wartości - Można użyć po
count(), aby sprawnie tworzyć tabulacje krzyżowe
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)Często zadawane pytania
Czy lekcja „Z układu długiego do szerokiego za pomocą pivot_wider()” jest bezpłatna?
Tak — pełny tekst „Z układu długiego do szerokiego za pomocą pivot_wider()” 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 długiego do szerokiego za pomocą pivot_wider()”?
Przekształcaj pary klucz-wartość z powrotem w tabele w układzie szerokim. Ć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 2 z 4.
Ile czasu zajmuje lekcja „Z układu długiego do szerokiego za pomocą pivot_wider()”?
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