Combina due DataFrame in R

Gustavo du Mortier 29 novembre 2021
  1. Usa rbind per combinare due DataFrame in R
  2. Usa il pacchetto dplyr
  3. Combina frame di Big Data in R
Combina due DataFrame in R

Quando si manipolano i dati con il codice R, spesso ci troviamo di fronte alla necessità di combinare due DataFrame in uno. Questo tutorial vedrà alcuni metodi per combinare in modo efficiente due DataFrame in R.

Supponiamo di avere due DataFrame, x e y, con alcune colonne corrispondenti. Per esempio:

x <- data.frame(a=c(218, 415, 339), b=c(25, 19, 43), c=c(950, 872, 645))
y <- data.frame(a=c(309, 115), c=c(799, 814))

E devi combinarli in un DataFrame risultante, chiamato z, per esempio. Tali DataFrame potrebbero essere come questi:

Esempio di DataFrame R

Usa rbind per combinare due DataFrame in R

La funzione rbind combina strutture di dati, come DataFrame, vettori o matrici, per righe. Il suo nome sta per row-bind.

Quando si utilizza rbind per combinare due DataFrame, entrambi i DataFrame devono avere le stesse colonne. Pertanto, nell’esempio precedente, è necessario aggiungere la colonna b al DataFrame y. Questo può essere fatto eseguendo questo comando:

y$b <- NA

Ora il data frame y dovrebbe assomigliare a questo:

Esempio di DataFrame R

Ora puoi usare rbind per combinare i DataFrame x e y nel nuovo DataFrame z eseguendo questo comando:

x <- data.frame(a=c(218, 415, 339), b=c(25, 19, 43), c=c(950, 872, 645))
y <- data.frame(a=c(309, 115), c=c(799, 814))

y$b <- NA

z <- rbind(x, y)

Produzione:

    a  b   c
1 218 25 950
2 415 19 872
3 339 43 645
4 309 NA 799
5 115 NA 814

Usa il pacchetto dplyr

Se non vuoi scrivere una riga di codice in più o aggiungere colonne fittizie a uno dei DataFrame solo per poter usare rbind, puoi installare il pacchetto dplyr e poi usare semplicemente:

z <- bind_rows(x, y)

Popola il data frame z con la combinazione di x e y.

Combina frame di Big Data in R

Gli esempi precedenti funzionano bene con piccoli DataFrame con poche righe e 2 o 3 colonne. Ma quando è necessario unire set di big data con molte righe e un numero arbitrario di colonne, potrebbe essere meglio scrivere una funzione che svolga il lavoro più velocemente, come la seguente:

quickmerge <- function(df1, df2) {
  df1.names <- names(df1)
  df2.names <- names(df2)
  df2.add <- setdiff(df1.names, df2.names)
  df1.add <- setdiff(df2.names, df1.names)
  if(length(df2.add) > 0) {
    for(i in 1:length(df2.add)) {
      df2[df2.add[i]] <- NA
    }
  }
  if(length(df1.add) > 0) {
    for(i in 1:length(df1.add)) {
      df1[df1.add[i]] <- NA
    }
  }
  return(rbind(df1, df2))
}

Questa funzione inizia confrontando i nomi delle colonne nei DataFrame e quindi aggiungendo le colonne necessarie per renderli uguali. Infine, utilizza la funzione rbind per combinare le righe e restituire il risultato. Per chiamare la funzione, usi:

z <- quickmerge(x, y)

Il codice di esempio completo è il seguente.

quickmerge <- function(df1, df2) {
  df1.names <- names(df1)
  df2.names <- names(df2)
  df2.add <- setdiff(df1.names, df2.names)
  df1.add <- setdiff(df2.names, df1.names)
  if(length(df2.add) > 0) {
    for(i in 1:length(df2.add)) {
      df2[df2.add[i]] <- NA
    }
  }
  if(length(df1.add) > 0) {
    for(i in 1:length(df1.add)) {
      df1[df1.add[i]] <- NA
    }
  }
  return(rbind(df1, df2))
}

x <- data.frame(a=c(218, 415, 339), b=c(25, 19, 43), c=c(950, 872, 645))
y <- data.frame(a=c(309, 115), c=c(799, 814))

z <- quickmerge(x, y)

print(z)

Produzione:

    a  b   c
1 218 25 950
2 415 19 872
3 339 43 645
4 309 NA 799
5 115 NA 814

Articolo correlato - R Data Frame