HOWTO · R

Combina due DataFrame in R

Questo tutorial presenta diversi metodi per combinare due data frame in R: `rbind()`, `bind_rows()` del pacchetto `dplyr` e funzioni di join come `plyr::join()` e `merge()`. Le prestazioni dipendono dai dati e dall’ambiente: misura input rappresentativi prima di fare affermazioni sulla velocità o adottare ottimizzazioni personalizzate.

In questa pagina

Per combinare due data frame in R, stabilisci prima se vuoi aggiungere righe o abbinare record correlati. Usa rbind() quando i due input contengono lo stesso tipo di record e colonne compatibili; usa dplyr::bind_rows() quando vuoi aggiungere righe includendo anche colonne presenti in un solo input. Usa plyr::join() o merge() di base R quando vuoi abbinare le righe tramite una chiave, per esempio un ID. Gli esempi seguenti usano tabelle piccole, così puoi adattare i nomi e i valori delle colonne ai tuoi dati.

Come combinare due data frame in R con la funzione rbind()

La funzione rbind() di base R aggiunge le righe di un data frame dopo quelle di un altro. Gli input devono avere le stesse colonne, con nomi corrispondenti e valori compatibili. La corrispondenza dei nomi è più importante dell’ordine delle colonne: rbind() le allinea in base al nome, mantenendo i valori sotto le intestazioni corrette. Non crea l’unione di colonne con nomi diversi e non riempie i campi assenti. Se gli input rappresentano campi diversi, uniformane prima la struttura oppure usa bind_rows().

Questo esempio crea due tabelle con la stessa struttura e poi accoda i record con rbind():

x <- data.frame(
  id = c(1, 2),
  score = c(88, 91)
)
y <- data.frame(
  id = c(3, 4),
  score = c(85, 96)
)

combined <- rbind(x, y)
print(combined)
  id score
1  1    88
2  2    91
3  3    85
4  4    96

Ogni riga del risultato è un’altra osservazione delle stesse variabili. Le righe della prima tabella restano all’inizio, seguite da quelle della seconda. Se i data frame hanno insiemi di campi diversi, usa bind_rows() per rappresentare con NA i valori assenti.

Come combinare due data frame in R con il pacchetto dplyr

Il pacchetto dplyr mette a disposizione bind_rows() per accodare record quando i data frame di input hanno colonne diverse. La funzione abbina le colonne per nome e include quelle presenti in uno qualsiasi degli input; alle righe prive di un valore per una colonna assegna NA. È utile quando due fonti descrivono lo stesso tipo di record, ma una contiene un campo aggiuntivo. È comunque un accodamento di righe, quindi non abbina i record tramite un ID.

Per usare dplyr::bind_rows() nel tuo script, installa dplyr con install.packages("dplyr"). L’esempio preferisce questa funzione se il pacchetto è installato; altrimenti, usa un semplice ripiego in base R che allinea le colonne con lo stesso nome e riempie i valori assenti con NA, così può essere eseguito senza pacchetti aggiuntivi.

first <- data.frame(id = 1, score = 88)
second <- data.frame(id = 2, group = "B")

if (requireNamespace("dplyr", quietly = TRUE)) {
  combined <- dplyr::bind_rows(first, second)
} else {
  columns <- union(names(first), names(second))
  align_columns <- function(data) {
    for (column in setdiff(columns, names(data))) data[[column]] <- NA
    data[columns]
  }
  combined <- rbind(align_columns(first), align_columns(second))
}

cat("id score group\n")
for (i in seq_len(nrow(combined))) {
  score <- if (is.na(combined$score[i])) "NA" else as.character(combined$score[i])
  group <- if (is.na(combined$group[i])) "NA" else combined$group[i]
  cat(paste(combined$id[i], score, group), "\n", sep = "")
}
id score group
1 88 NA
2 NA B

Come combinare due data frame in R con il pacchetto plyr

La funzione join() del pacchetto plyr combina righe correlate usando colonne chiave: è un join, non un accodamento di righe. Imposta by sulla chiave condivisa. Con type = "inner", il risultato conserva solo le chiavi presenti in entrambi gli input; il valore predefinito type = "left" mantiene tutte le righe del primo input. Per usare plyr::join() nel tuo script, installa plyr con install.packages("plyr"). L’esempio preferisce questa funzione quando è disponibile e, in caso contrario, usa merge() di base R per ottenere lo stesso risultato di un inner join. Per scegliere un altro tipo di join, consulta ?plyr::join nel pacchetto installato.

people <- data.frame(id = c(1, 2), name = c("Ada", "Ben"))
ages <- data.frame(id = c(2, 3), age = c(25, 30))

if (requireNamespace("plyr", quietly = TRUE)) {
  matched <- plyr::join(people, ages, by = "id", type = "inner")
} else {
  matched <- merge(people, ages, by = "id")
}

cat("id name age\n")
for (i in seq_len(nrow(matched))) {
  cat(paste(matched$id[i], matched$name[i], matched$age[i]), "\n", sep = "")
}
id name age
2 Ben 25

Come combinare due data frame in R con la funzione merge()

La funzione merge() di base R unisce i data frame abbinando i valori nelle colonne chiave. Se entrambi gli input hanno una colonna con lo stesso nome, by indica quella chiave. Per impostazione predefinita, merge() conserva le chiavi corrispondenti presenti in entrambi gli input, realizzando un inner join. Imposta all.x = TRUE per mantenere tutte le righe di x, all.y = TRUE per mantenere tutte le righe di y, oppure entrambi per conservare anche le righe senza corrispondenza da entrambi i lati. Verifica che le colonne chiave abbiano tipi compatibili e che le chiavi duplicate siano intenzionali: le corrispondenze ripetute possono generare più righe nel risultato.

Questo esempio autonomo unisce due tabelle tramite id e stampa i record corrispondenti:

people <- data.frame(
  id = c(1, 2, 3),
  name = c("Ada", "Ben", "Cy")
)
ages <- data.frame(
  id = c(2, 3, 4),
  age = c(25, 30, 35)
)

matched <- merge(people, ages, by = "id")
print(matched)
  id name age
1  2  Ben  25
2  3   Cy  30

Usa merge(people, ages, by = "id", all.x = TRUE) se il risultato deve mantenere tutte le persone, comprese quelle senza un’età corrispondente. Per impostazione predefinita, merge() ordina l’output in base alla chiave, a meno che non si specifichi sort = FALSE. La tabella mostrata sopra è l’output osservato fornito per questo esempio.

Conclusione

Scegli rbind() per accodare righe con una struttura condivisa e dplyr::bind_rows() quando è opportuno accodare input con colonne diverse, riempiendo le celle mancanti con NA. Scegli plyr::join() o merge() quando vuoi abbinare record correlati tramite chiavi; merge() è disponibile in base R senza pacchetti aggiuntivi e offre opzioni per mantenere le righe senza corrispondenza. Prima di combinare insiemi di dati più grandi, controlla l’unicità delle chiavi, i tipi delle colonne e se l’operazione è un accodamento di righe o un join. Le prestazioni dipendono dai dati e dall’ambiente: misura input rappresentativi prima di fare affermazioni sulla velocità o adottare ottimizzazioni personalizzate.