rbindlist dos data.tables donde una tiene factor y la otra tiene un tipo de carácter para una columna

Acabo de descubrir esta advertencia en mi script que fue un poco extraño.

# Warning message:
# In rbindlist(list(DT.1, DT.2)) : NAs introduced by coercion

Observación 1: Aquí hay un ejemplo reproducible:

require(data.table)
DT.1 <- data.table(x = letters[1:5], y = 6:10)
DT.2 <- data.table(x = LETTERS[1:5], y = 11:15)

# works fine
rbindlist(list(DT.1, DT.2))
#     x  y
#  1: a  6
#  2: b  7
#  3: c  8
#  4: d  9
#  5: e 10
#  6: A 11
#  7: B 12
#  8: C 13
#  9: D 14
# 10: E 15

Sin embargo, ahora si convierto la columnax a unfactor (ordenados o no) y hacer lo mismo:

DT.1[, x := factor(x)]
rbindlist(list(DT.1, DT.2))
#      x  y
#  1:  a  6
#  2:  b  7
#  3:  c  8
#  4:  d  9
#  5:  e 10
#  6: NA 11
#  7: NA 12
#  8: NA 13
#  9: NA 14
# 10: NA 15
# Warning message:
# In rbindlist(list(DT.1, DT.2)) : NAs introduced by coercion

Perorbind hace este trabajo muy bien!

rbind(DT.1, DT.2) # where DT.1 has column x as factor
# do.call(rbind, list(DT.1, DT.2)) # also works fine
#     x  y
#  1: a  6
#  2: b  7
#  3: c  8
#  4: d  9
#  5: e 10
#  6: A 11
#  7: B 12
#  8: C 13
#  9: D 14
# 10: E 15

El mismo comportamiento se puede reproducir si columnax es unordered factor también. Desde la página de ayuda?rbindlist dice:Same as do.call("rbind",l), but much faster., Supongo que este no es el comportamiento deseado?

Aquí está la información de mi sesión:

# R version 3.0.0 (2013-04-03)
# Platform: x86_64-apple-darwin10.8.0 (64-bit)
# 
# locale:
# [1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
# 
# attached base packages:
# [1] stats     graphics  grDevices utils     datasets  methods   base     
# 
# other attached packages:
# [1] data.table_1.8.8
# 
# loaded via a namespace (and not attached):
# [1] tools_3.0.0
Editar:

Observación 2: Siguiendo otra observación interesante de @ AnandaMahto, invirtiendo el orden:

# column x in DT.1 is still a factor
rbindlist(list(DT.2, DT.1))
#     x  y
#  1: A 11
#  2: B 12
#  3: C 13
#  4: D 14
#  5: E 15
#  6: 1  6
#  7: 2  7
#  8: 3  8
#  9: 4  9
# 10: 5 10

Aquí, la columna deDT.1 es forzado en silencio anumeric.
Editar: Solo para aclarar, este es el mismo comportamiento que el derbind(DT2, DT1) con la columna x de DT1 siendo un factor.rbind Parece retener la clase del primer argumento. Dejaré esta parte aquí y mencionaré que en este caso, este es el comportamiento deseado ya querbindlist Es una implementación más rápida derbind.

Observación 3: Si ahora, ambas columnas se convierten a factores:

# DT.1 column x is already a factor
DT.2[, x := factor(x)]
rbindlist(list(DT.1, DT.2))
#     x  y
#  1: a  6
#  2: b  7
#  3: c  8
#  4: d  9
#  5: e 10
#  6: a 11
#  7: b 12
#  8: c 13
#  9: d 14
# 10: e 15

Aquí, la columna.x desdeDT.2 se pierde (/ reemplazado con el deDT.1). Si el orden se invierte, ocurre exactamente lo contrario (columna x deDT.1 es reemplazado con el deDT.2).

En general, parece que hay un problema con el manejofactor columnas enrbindlist.

Respuestas a la pregunta(2)

Su respuesta a la pregunta