0Pricing
R Academy · Lezione

Da formato long a wide con pivot_wider()

Ridistribuisca le coppie chiave-valore in tabelle dal formato wide.

Da formato long a wide con pivot_wider() è una lezione R Academy gratuita su CoddyKit. Questa è la lezione 2 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento R Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso R Academy include 4 lezioni in totale.

Quando usare il formato wide

Sebbene il formato long sia adatto all'analisi, il formato wide è spesso necessario per report, fogli di calcolo e determinati algoritmi (ad esempio le matrici di correlazione). pivot_wider() è l'inverso di pivot_longer(): distribuisce i valori di una colonna in più nuove colonne.

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

Nozioni di base su pivot_wider()

pivot_wider(df, names_from, values_from) converte il formato long in formato wide. names_from specifica la colonna i cui valori diventeranno i nuovi nomi delle colonne; values_from specifica la colonna i cui valori riempiranno tali nuove colonne.

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 — Identificare le chiavi delle righe

id_cols specifica quali colonne identificano univocamente ogni riga nell'output wide. Per impostazione predefinita, dplyr utilizza tutte le colonne non specificate in names_from o values_from. Impostarlo esplicitamente evita raggruppamenti imprevisti.

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 — Gestione delle combinazioni mancanti

Quando alcune combinazioni di id_cols e names_from non esistono, la cella risultante sarebbe NA. Utilizzi values_fill per sostituire questi valori mancanti con un valore predefinito (ad esempio, 0 per conteggi o somme).

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 — Aggiunta di prefissi

Utilizzi names_prefix per anteporre una stringa a tutti i nuovi nomi di colonna. In questo modo evita problemi quando i valori di names_from sono numeri o quando desidera rendere più descrittivi i nomi delle colonne.

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

Più colonne values_from

Può eseguire il pivot simultaneo di più colonne di valori passando un vettore a values_from. Le colonne risultanti vengono denominate come value_name, combinando il nome della colonna di valori e la categoria.

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

Gestione dei duplicati con values_fn

Se esistono più valori per la stessa combinazione id + name, pivot_wider non sa quale utilizzare e restituisce una list-column con un avviso. Utilizzi values_fn per risolvere il problema specificando una funzione di aggregazione.

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 con una lista denominata

Passi una lista denominata a values_fn per applicare simultaneamente funzioni di aggregazione diverse a colonne di valori diverse. Questa soluzione è particolarmente utile quando esegue il pivot di più colonne di valori che richiedono metodi di riepilogo differenti.

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

Creazione di tabelle a doppia entrata

Una tabella a doppia entrata (o tabella di contingenza) in forma di data frame può essere creata facilmente con pivot_wider() dopo il conteggio con dplyr::count(). In questo modo combina la potenza di entrambi i pacchetti per l'analisi delle frequenze.

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
  )

Andata e ritorno: long -> wide -> long

Comprendere la relazione inversa tra pivot_longer() e pivot_wider() aiuta a individuare gli errori. Un percorso di andata e ritorno (long->wide->long) dovrebbe restituire i dati originali, a parte l'ordine delle righe e le conversioni dei tipi.

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

Esempio pratico: report dei punteggi

Un caso d'uso tipico consiste nel prendere una tabella lunga di punteggi dei test e trasformarla in una tabella di report con uno studente per riga e una materia per colonna. Combini questa operazione con dplyr::arrange() e rename() per produrre un risultato ordinato e pronto per la presentazione.

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

Verifica rapida

Che cosa succede quando chiama pivot_wider() e ci sono più valori per la stessa combinazione id + name?

Riepilogo: pivot_wider()

Punti chiave della conversione da long a wide:

  • pivot_wider(names_from, values_from) distribuisce una colonna chiave in più nuove colonne
  • id_cols specifica quali colonne identificano ogni riga
  • values_fill = 0 (o qualsiasi valore scalare) riempie le combinazioni mancanti
  • names_prefix antepone una stringa per evitare nomi di colonna numerici o ambigui
  • values_fn risolve i valori duplicati nelle celle con una funzione di aggregazione
  • Passi un vettore a values_from per eseguire simultaneamente il pivot di più colonne di valori
  • Utilizzi questa funzione dopo count() per creare in modo efficiente tabelle a doppia entrata
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)

Domande Frequenti

La lezione «Da formato long a wide con pivot_wider()» è gratuita?

Sì — il testo completo di «Da formato long a wide con pivot_wider()» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso R Academy, passa a CoddyKit PRO. Il corso R Academy include 4 lezioni in totale.

Cosa imparerò in «Da formato long a wide con pivot_wider()»?

Ridistribuisca le coppie chiave-valore in tabelle dal formato wide. Eserciti R Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare R Academy?

Non è richiesta alcuna esperienza precedente. R Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 4.

Quanto tempo richiede la lezione «Da formato long a wide con pivot_wider()»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione R Academy?

Sì. Ogni lezione R Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Da formato wide a long con pivot_longer()
  2. Da formato long a wide con pivot_wider()
  3. separate() e unite() per le colonne di testo
  4. Annidamento e disannidamento dei data frame
← Torna a R Academy