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