2011-12-22 28 views
8

Ho due frame di dati con un diverso numero di colonne ciascuno. Alcune delle colonne sono comuni tra i 2 frame di dati. Come posso rbindare solo le colonne comuni dei due frame di dati in un nuovo frame di dati?Come rbindare solo le colonne comuni di due set di dati

ho provato con library(plyr);rbind.fill(A,B) tuttavia imposta valori NA nelle colonne che non corrispondono, e questo non mi aiuta.

Grazie mille CE

risposta

23

Usa intersect per recuperare le colonne comuni.

dfr1 <- data.frame(x = 1:5, y = runif(5), z = rnorm(5)) 
dfr2 <- data.frame(w = letter[1:5], x = 6:10, y = runif(5)) 
common_cols <- intersect(colnames(dfr1), colnames(dfr2)) 
rbind(
    subset(dfr1, select = common_cols), 
    subset(dfr2, select = common_cols) 
) 

Come sottolineato nei commenti, è possibile sostituire l'ultima riga con

rbind(
    dfr1[, common_cols], 
    dfr2[, common_cols] 
) 

per un piccolo miglioramento delle prestazioni e digitando.

rbind(
    dfr1[common_cols], 
    dfr2[common_cols] 
) 

funziona anche, ma penso che sia un po 'meno chiaro.

+0

Nizza utilizzo di intersezione! +1 – ECII

+0

Molto succinta e comprensibile. +1 –

+2

Non c'è bisogno di usare sottoinsieme qui - e generalmente si vuole evitare di programmare con qualsiasi funzione che usi una valutazione non standard. (E non sono sicuro del perché tu voglia usarlo perché è piuttosto prolisso rispetto a 'dfr1 [common_cols]') – hadley

2

Ecco la mia soluzione speranza ho ottenuto il vostro domanda giusta

df1 <- data.frame(a=rnorm(100), b=rnorm(100), not=rnorm(100)) 
df2 <- data.frame(a=rnorm(100), b=rnorm(100)) 

bind1 <- bind1 <- df1[, names(df1) %in% names(df2)] 
bind2 <- bind1 <- df1[, names(df2) %in% names(df1)] 

rbind(bind1, bind2) 
+0

Cosa succede se 'df2' ha colonne che non sono in' df1'? –

+0

Inoltre, la chiamata a 'sottoinsieme' non è necessaria. Se si utilizzerà l'indicizzazione in un secondo momento, è sufficiente passare loro il vettore logico creato da 'names (df1)% in% names (df2)'. –

+0

come per il tuo primo commento: se df2 ha colonne che non sono in df1 - non sono comuni e non voglio filtrarle - o sbaglio? per quanto riguarda il tuo secondo commento: giusto questo sarebbe meglio probabilmente l'ho fatto un po 'troppo sciatto ... – Seb

Problemi correlati