¿Es posible enlazar dos marcos de datos que no tienen el mismo conjunto de columnas? Espero retener las columnas que no coinciden después del enlace.
232
rbind.fill
del paquete plyr
puede ser lo que estás buscando.
rbind.fill
ybind_rows()
ambos silenciosamente sueltan nombres de fila.Una solución más reciente es usar
dplyr
labind_rows
función que supongo es más eficiente quesmartbind
.fuente
ABC
no se puede convertir de carácter a numérico. ¿Hay alguna forma de convertir las columnas primero?Puedes usar
smartbind
desde elgtools
paquete.Ejemplo:
fuente
smartbind
con dos marcos de datos grandes (en total, aproximadamente 3 * 10 ^ 6 filas) y lo aborté después de 10 minutos.Si las columnas en df1 son un subconjunto de las de df2 (por nombres de columna):
fuente
Una alternativa con
data.table
:rbind
también funcionarádata.table
siempre que los objetos se conviertan endata.table
objetos, por lo queTambién funcionará en esta situación. Esto puede ser preferible cuando tienes un par de data.tables y no quieres construir una lista.
fuente
intersect
enfoque, solo funcionan para 2 marcos de datos y no se generalizan fácilmente.La mayoría de las respuestas de la base R abordan la situación en la que solo un data.frame tiene columnas adicionales o que el data.frame resultante tendría la intersección de las columnas. Dado que el OP escribe , espero retener las columnas que no coinciden después del enlace , probablemente valga la pena publicar una respuesta que utilice métodos de base R para abordar este problema.
A continuación, presento dos métodos base R: uno que altera los data.frames originales y otro que no. Además, ofrezco un método que generaliza el método no destructivo a más de dos data.frames.
Primero, obtengamos algunos datos de muestra.
Dos marcos de datos, alterar originales
Para retener todas las columnas de ambos data.frames en un
rbind
(y permitir que la función funcione sin provocar un error), agregue columnas NA a cada data.frame con los nombres faltantes correspondientes rellenados utilizandosetdiff
.Ahora,
rbind
-emTenga en cuenta que las dos primeras líneas alteran los data.frames originales, df1 y df2, agregando el conjunto completo de columnas a ambos.
Dos marcos de datos, no altere los originales
Para dejar intactos los marcos de datos originales, primero recorra los nombres que difieren, devuelva un vector con nombre de NA que se concatenan en una lista con el marco de datos
c
. Luego,data.frame
convierte el resultado en un data.frame apropiado pararbind
.Muchos marcos de datos, no alteran los originales
En el caso de que tenga más de dos data.frames, puede hacer lo siguiente.
¿Quizás sea un poco más agradable no ver los nombres de las filas de data.frames originales? Entonces haz esto.
fuente
mydflist <- list(as, dr, kr, hyt, ed1, of)
. Esto debería construir un objeto de lista que no aumente el tamaño de su entorno, sino que solo apunte a cada elemento de la lista (siempre que no altere ninguno de los contenidos después). Después de la operación, elimine el objeto de la lista, solo para estar seguro.También podría simplemente extraer los nombres de columna comunes.
fuente
Escribí una función para hacer esto porque me gusta que mi código me diga si algo está mal. Esta función le dirá explícitamente qué nombres de columna no coinciden y si tiene un tipo no coincidente. Entonces hará todo lo posible para combinar data.frames de todos modos. La limitación es que solo puede combinar dos data.frames a la vez.
fuente
Tal vez leí completamente su pregunta, pero el "Espero retener las columnas que no coinciden después del enlace" me hace pensar que está buscando una consulta SQL
left join
oright join
similar. R tiene elmerge
función que le permite especificar uniones izquierdas, derechas o internas similares a unir tablas en SQL.Ya hay una gran pregunta y respuesta sobre este tema aquí: ¿Cómo unir (fusionar) marcos de datos (interno, externo, izquierdo, derecho)?
fuente
A gtools / smartbind no le gustaba trabajar con Dates, probablemente porque era un vector. Así que aquí está mi solución ...
fuente
Solo por la documentación. Puede probar la
Stack
biblioteca y su funciónStack
de la siguiente forma:También tengo la impresión de que es más rápido que otros métodos para grandes conjuntos de datos.
fuente
También podría usar
sjmisc::add_rows()
, que usadplyr::bind_rows()
, pero a diferenciabind_rows()
,add_rows()
conserva los atributos y, por lo tanto, es útil para los datos etiquetados .Vea el siguiente ejemplo con un conjunto de datos etiquetado. La
frq()
función imprime tablas de frecuencia con etiquetas de valor, si los datos están etiquetados.fuente
fuente