Tengo diez conjuntos de datos que se han leído de archivos de Excel, usando la biblioteca xlsx , y almacenados en tibbles. Quiero fusionarlos.

Aquí hay ejemplos de conjuntos de datos. El número de variables difiere entre los conjuntos de datos, y algunas variables solo están en un conjunto de datos. El valor de la variable persona nunca se superpondrá.

data1 <- tibble(person = c("A","B","C"),
    test1 = as.factor(c(1,4,5)), 
    test2 = c(14,25,10),
    test3 = c(12.5,16.0,4),
    test4 = c(16,23,21),
    test5 = as.factor(c(49,36,52)))

data2 <- tibble(person = c("D","E","F"),
    test1 = c(8,7,2), 
    test3 = c(6.5,12.0,19.5),
    test4 = as.factor(c(15,21,29)),
    test5 = as.factor(c(54,51,36)),
    test6 = c(32,32,29),
    test7 = c(13,11,10))

Los conjuntos de datos reales generalmente tienen ~ 50 filas y ~ 200 variables en ellas. Yo he tratado

    all_data <- dplyr::bind_rows(data1,data2)

Con la esperanza de obtener este resultado

# A tibble: 6 x 8
  person test1 test2 test3 test4 test5 test6 test7
   <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1      A     1    14  12.5    16    49    NA    NA
2      B     4    25  16.0    23    36    NA    NA
3      C     5    10   4.0    21    52    NA    NA
4      D     8    NA   6.5    15    54    32    13
5      E     7    NA  12.0    21    51    32    11
6      F     2    NA  19.5    29    36    29    10

Pero en cambio obtengo este error

Error in bind_rows_(x, .id) : Column `test1` can't be converted from factor to numeric

He buscado en Stackoverflow, y encontré preguntas al respecto, y la mayoría de las respuestas se centran en tratar de convertir las variables a otra clase. Pero no me importa qué clases tienen mis variables, porque simplemente escribiré el conjunto de datos combinado en un archivo CSV o un archivo Excel.

¿No hay algún tipo de solución simple?

11
asterdroid 17 oct. 2017 a las 14:24

3 respuestas

La mejor respuesta

Creo que esto debería funcionar:

library(plyr)
all_data <- rbind.fill(data1,data2)
9
raquela 17 oct. 2017 a las 11:45

Test1 en data1 es de factor de clase, mientras que en data2 es de clase numérica. La combinación de una clase de factor y una clase numérica causa este problema. La solución convierte la prueba1 tanto en datos1 como en datos2 en factores y luego usa all_data <- dplyr::bind_rows(data1,data2)

O

data.table::rbindlist(data1,data2)

0
Gucci148 6 may. 2020 a las 19:30

Como el archivo suele ser pequeño (varios cientos de filas) y simplemente desea combinar los dos archivos y escribir en un nuevo archivo, creo que podemos convertir todas las columnas en caracteres, por lo tanto, las columnas comunes en data1 y {{ X1}} tendrá el mismo tipo.

library(dplyr)
bind_rows(mutate_all(data1, as.character), mutate_all(data2, as.character))
8
mt1022 17 oct. 2017 a las 11:45