2011-12-22 12 views
8

Tengo 2 marcos de datos con diferente número de columnas cada uno. Algunas de las columnas son comunes entre los 2 marcos de datos. ¿Cómo puedo vincular solo las columnas comunes de los dos marcos de datos a un nuevo marco de datos?Cómo enlazar solo las columnas comunes de dos conjuntos de datos

probé con library(plyr);rbind.fill(A,B) sin embargo, establece valores de NA en las columnas que no coinciden, y esto no me ayuda.

Muchas gracias CE

Respuesta

23

Uso intersect para recuperar las columnas comunes.

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

Como se señaló en los comentarios, puede reemplazar la última línea con

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

para un pequeño rendimiento y la tipificación de mejora.

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

también funciona, pero creo que es un poco menos claro.

+0

Niza uso de intersecan! +1 – ECII

+0

Muy sucinto y comprensible. +1 –

+2

No es necesario utilizar un subconjunto aquí, y generalmente desea evitar la programación con cualquier función que utilice una evaluación no estándar. (Y no estoy seguro de por qué querría usarlo porque es bastante detallado en comparación con 'dfr1 [common_cols]') – hadley

2

Aquí está mi solución esperanza de que consiguiera su pregunta correcta

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

¿Qué sucede si 'df2' tiene columnas que no están en' df1'? –

+0

Además, la llamada a 'subconjunto' no es necesaria. Si va a utilizar indexación más adelante, puede pasarles el vector lógico creado por 'names (df1)% en% names (df2)'. –

+0

en cuanto a su primer comentario: si df2 tiene columnas que no están en df1 - no son comunes y no quiero filtrarlas - ¿o estoy equivocado? en cuanto a su segundo comentario: correcto, esto sería mejor, probablemente lo hice un poco demasiado descuidado ... – Seb

Cuestiones relacionadas