0Pricing
R Academy · Lekcja

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 kolumnach
  • id_cols określa kolumny identyfikujące każdy wiersz
  • values_fill = 0 (lub dowolna wartość skalarna) uzupełnia brakujące kombinacje
  • names_prefix dodaje ciąg znaków na początku nazwy, aby uniknąć numerycznych lub niejednoznacznych nazw kolumn
  • values_fn rozwiązuje problem zduplikowanych wartości w komórkach za pomocą funkcji agregującej
  • Przekazanie wektora do values_from umoż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

  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