2011-10-12 13 views
36

Come posso unire le colonne di due frame di dati, contenenti un insieme distinto di colonne ma alcune righe con lo stesso nome? I campi per le righe che non si verificano in entrambi i frame di dati devono essere riempiti con zeri:Unisci frame di dati in base ai nomi di personaggi in R

> d 
    a b c d e f g h i j 
1 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 10 
2 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 
> e 
    k l m n o p q r s t 
1 11 12 13 14 15 16 17 18 19 20 
3 21 22 23 24 25 26 27 28 29 30 
> de 
    a b c d e f g h i j k l m n o p q r s t 
1 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 10 11 12 13 14 15 16 17 18 19 20 
2 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 0 0 0 0 0 0 0 0 0 0 
3 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0 21 22 23 24 25 26 27 28 29 30 

risposta

61

Vedi ?merge:

il nome di "row.names" o il numero 0 specifica i nomi di riga .

Esempio:

R> de <- merge(d, e, by=0, all=TRUE) # merge by row names (by=0 or by="row.names") 
R> de[is.na(de)] <- 0     # replace NA values 
R> de 
    Row.names a b c d e f g h i j k l m n o p q r s 
1   1 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 10 11 12 13 14 15 16 17 18 19 
2   2 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 0 0 0 0 0 0 0 0 0 
3   3 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0 21 22 23 24 25 26 27 28 29 
    t 
1 20 
2 0 
3 30 
+0

che fa il lavoro, grazie. C'è un modo più performante? Bastano pochi minuti per unire due colonne con 200k righe, ci vogliono anche pochi minuti per unire un dataframe vuoto con una cornice dati a singola colonna che ha 200k righe ... – barbaz

+0

Sì, controlla il pacchetto sqldf: http://code.google .com/p/sqldf/ – rcs

+5

e c'è un modo per preservare i nomi delle righe? e non farli spostare in una colonna dedicata? ovviamente si può fare 'rownames (de) = de $ Row.names' dopo, chiedendosi solo se esiste un modo per non romperlo in primo luogo ... – barbaz

Problemi correlati