2012-12-31 14 views
45

Possible Duplicate:
Merge multiple data frames in a list simultaneouslyUnire un sacco di data.frames

esempio data.frames:

df1 = data.frame(id=c('1','73','2','10','43'),v1=c(1,2,3,4,5)) <br> 
df2 = data.frame(id=c('7','23','57','2','62','96'),v2=c(1,2,3,4,5,6)) <br> 
df3 = data.frame(id=c('23','62'),v3=c(1,2)) <br> 

Nota: id è unico per ogni data.frame. Voglio la matrice risultante per assomigliare

1  1 NA NA 
2  3 4 NA 
7  NA 1 NA 
10  4 NA NA 
23  NA 2 1 
43  5 NA NA 
57  NA 3 NA 
62  NA 5 2 
73  2 NA NA 
96  NA 6 NA 

In questo caso, ho conservato solo 3 set di dati, che in realtà sono almeno 22 di loro così alla fine voglio una matrice nx (22 + 1) dove n è il numero di ID per tutti i 22 set di dati.

Dato 2 dataset, ho bisogno di ottenere il loro ids nella prima colonna e 2 ° e 3 colonne vengono riempite con i valori, se non esiste alcun valore, quindi inserire NA invece.

+0

Questa non è una soluzione, ma in aggiunta a quanto affermato da @ Matthew Plourde. È possibile creare un elenco di data.frames: df_list <- lapply (paste0 ("df", 1: 22), as.name). –

+1

Anche se questo thread può essere duplicato di un altro, ma entrambe le domande e le risposte sono presentate in un modo più leggibile. – biocyberman

risposta

107

metterli in una list e utilizzare merge con Reduce

Reduce(function(x, y) merge(x, y, all=TRUE), list(df1, df2, df3)) 
# id v1 v2 v3 
# 1 1 1 NA NA 
# 2 10 4 NA NA 
# 3 2 3 4 NA 
# 4 43 5 NA NA 
# 5 73 2 NA NA 
# 6 23 NA 2 1 
# 7 57 NA 3 NA 
# 8 62 NA 5 2 
# 9 7 NA 1 NA 
# 10 96 NA 6 NA 

È inoltre possibile utilizzare questa versione più concisa:

Reduce(function(...) merge(..., all=TRUE), list(df1, df2, df3)) 
+4

+1 per 'Riduci '. Per questo semplice esempio, ciò equivale a unire (unire (df1, df2, da = 'id', all = T), df3, da = 'id', all = T) '. Chiaramente potrebbe essere usato un ciclo, scorrere attraverso i frame di dati - ma questo è esattamente ciò che fa "Reduce". –

+3

Sono grato che 'Reduce' è nella lingua, ma vorrei davvero che fosse più simile alle funzioni' * apply', permettendoti di dargli ulteriori argomenti per la funzione fornita. Odio che devo incorporare una definizione di funzione solo per usare 'unire 'con' tutto = TRUE'. –

+2

'merge_recurse' e' merge_all' dal (vecchio) pacchetto di risagoma sono una guida decente su come creare qualcosa che faccia questo per te in una forma più conveniente. – joran

Problemi correlati