0Pricing
R Academy · Lezione

Da formato wide a long con pivot_longer()

Rimodelli tabelle in formato wide nel formato long tidy per l'analisi.

Da formato wide a long con pivot_longer() è una lezione R Academy gratuita su CoddyKit. Questa è la lezione 1 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.

Formati dei dati wide e long

I dati possono essere memorizzati in formato wide (una riga per soggetto, più colonne di valori) oppure in formato long (una riga per osservazione, una colonna per il nome della variabile e un'altra per il valore). Molti pacchetti R per la visualizzazione e la modellazione si aspettano il formato long.

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

Nozioni di base su pivot_longer()

pivot_longer(df, cols, names_to, values_to) converte il formato wide in formato long. cols specifica le colonne da trasformare, names_to è la nuova colonna per i vecchi nomi delle colonne e values_to è la nuova colonna per i valori.

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)

Selezionare colonne con starts_with()

Invece di elencare esplicitamente le colonne, utilizzi gli helper tidyselect all'interno di cols. starts_with('prefix'), ends_with('suffix') e contains('string') sono particolarmente utili per trasformare in modo coerente colonne con nomi strutturati.

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

Escludere colonne con -col

Un altro approccio consiste nello specificare quali colonne escludere dalla trasformazione usando -col_name. Tutto il resto viene trasformato. È utile quando si hanno solo una o due colonne identificative e molte colonne di valori.

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 — Rimuovere i prefissi

Quando i nomi delle colonne hanno un prefisso come score_q1, score_q2, l'argomento names_prefix rimuove quel prefisso dalla colonna names_to risultante. In questo modo l'identificatore rimane pulito.

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

Trasformare più gruppi di colonne

Quando si hanno più gruppi di colonne di valori (ad esempio sia sales_q1 sia cost_q1), utilizzi names_to con più valori e names_pattern per suddividere i nomi delle colonne in parti.

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 — Convertire i tipi

Per impostazione predefinita, la nuova colonna dei nomi è di tipo carattere. Utilizzi names_transform per convertire automaticamente la colonna dei nomi in un tipo diverso (ad esempio, l'anno intero dai nomi di colonna come y2020, 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 — Rimuovere i valori mancanti

Quando il formato wide contiene valori mancanti per alcune combinazioni colonna-riga, questi vengono visualizzati come NA nel formato long. Imposti values_drop_na = TRUE per rimuovere automaticamente le righe in cui il valore è 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)

Il formato long abilita ggplot2

Il motivo più importante per trasformare i dati in formato long è che ggplot2 associa le estetiche alle colonne. Quando tutti i valori si trovano in un'unica colonna e le relative categorie in un'altra, può utilizzare facilmente color = quarter o 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()

Trasformare colonne con nomi numerici

A volte i nomi delle colonne sono costituiti solo da numeri (ad esempio gli anni: 2020, 2021). In R, i nomi di colonna numerici vengono racchiusi tra virgolette nei data frame. Utilizzi num_range('', 2020:2023) oppure racchiuda i nomi tra backtick nell'argomento cols per gestirli.

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

Confrontare i risultati della trasformazione

Dopo la trasformazione, convalidi il risultato: il numero di righe dovrebbe essere nrow(wide) * n_pivoted_cols e i valori univoci nella colonna names_to dovrebbero corrispondere ai nomi originali delle colonne, escluso il prefisso se è stato rimosso.

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

Verifica rapida

Che cosa fa l'argomento names_prefix in pivot_longer()?

Riepilogo: pivot_longer()

Punti chiave della conversione da wide a long:

  • pivot_longer(df, cols, names_to, values_to) è la funzione principale
  • cols accetta tidyselect: starts_with(), -id_col, c('a','b')
  • names_prefix rimuove una stringa iniziale dai nomi delle colonne
  • names_transform converte il tipo della colonna dei nomi (ad esempio in intero)
  • values_drop_na = TRUE rimuove automaticamente le righe con NA
  • Il formato long è richiesto da ggplot2, dalla maggior parte delle funzioni di modellazione e dai test statistici
  • Convalidi il risultato: righe long = righe wide × numero di colonne trasformate
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'
)

Domande Frequenti

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

Sì — il testo completo di «Da formato wide a long con pivot_longer()» è 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 wide a long con pivot_longer()»?

Rimodelli tabelle in formato wide nel formato long tidy per l'analisi. 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 1 di 4.

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

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