Algunos datos de ejemplo de estructura:

df1 = data.frame(x=c('a', 'b', 'c', 'd', 'e'))
df2 = data.frame(x=c('f', 'g', 'h'),y = c(0,1,0))
df3 = data.frame(x=c('i', 'j','k','l'), y = c(1,7,5,2,6), z = c(75,3,25,2,1))

Tengo 3 marcos de datos diferentes.

Df1 tiene 22201 objeto y 121 variables df2 tiene 8403 objeto y 68 variables df3 tiene 50476 objeto y 157 variables

Intento fusionarlos usando fusionar y recibo este error:

Error in fix.by(by.x, x) : 
  'by' must specify one or more columns as numbers, names or logical

Usando cbind y recibí este error:

Error in data.frame(..., check.names = FALSE) : 
  arguments imply differing number of rows: 22201, 8403, 50476

Y rbind y recibo este error:

Error in rbind(deparse.level, ...) : 
  numbers of columns of arguments do not match

¿Cómo puedo fusionar marcos de datos con diferentes números de filas y columnas? Tengo que referirme que las columnas tienen los mismos nombres en los marcos de datos, por lo que en la fusión espero que el número de columnas sea el número más alto de columnas del marco de datos que contiene más.

r
0
PitterJe 14 nov. 2017 a las 17:36

2 respuestas

La mejor respuesta

En este caso, use rbind.fill de la biblioteca plyr

library(plyr)
rbind.fill(df1, df2, df3)

Esto merge todos sus 3 data frames con diferente número de columnas.

3
Santosh 14 nov. 2017 a las 14:44

dplyr es una evolución de plyr, así que lo usaría en su lugar. bind_rows logrará lo que desea:

library(dplyr)
bind_rows(df1, df2, df3, ...)

Un ejemplo:

tbl1 <- data_frame(var1 = c('a', 'b', 'c'),
                   var2 = c('x', 'y', 'z'))

tbl2 <- data_frame(var1 = c('e', 'd', 'g', 'h'))

tbl3 <- data_frame(var6 = 1, 
                   var10 = 14)

> bind_rows(tbl1, tbl2, tbl3)
# A tibble: 8 x 4
   var1  var2  var6 var10
  <chr> <chr> <dbl> <dbl>
1     a     x    NA    NA
2     b     y    NA    NA
3     c     z    NA    NA
4     e  <NA>    NA    NA
5     d  <NA>    NA    NA
6     g  <NA>    NA    NA
7     h  <NA>    NA    NA
8  <NA>  <NA>     1    14
2
quartin 14 nov. 2017 a las 14:58