rbindlist dwie dane.tabele, gdzie jeden ma czynnik, a drugi rodzaj znaku dla kolumny

Właśnie odkryłem to ostrzeżenie w moim skrypcie, które było trochę dziwne.

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

Obserwacja 1: Oto powtarzalny przykład:

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

Jednak teraz, jeśli dokonam konwersji kolumnyx do afactor (zamówione lub nie) i wykonaj to samo:

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

Alerbind robi to dobrze!

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

To samo zachowanie można odtworzyć, jeśli kolumnax jestordered factor także. Od strony pomocy?rbindlist mówi:Same as do.call("rbind",l), but much faster., Zgaduję, że to nie jest pożądane zachowanie?

Oto moje informacje o sesji:

# 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
Edytować:

Uwaga 2: Kolejna interesująca obserwacja @ AnandaMahto, odwracająca kolejność:

# 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

Tutaj kolumna zDT.1 jest po cichu zmuszonynumeric.
Edytować: Aby wyjaśnić, jest to takie samo zachowanie jak w przypadkurbind(DT2, DT1) przy czym kolumna x1 DT1 jest czynnikiem.rbind wydaje się, że zachowuje klasę pierwszego argumentu. Zostawię tę część tutaj i wspomnę, że w tym przypadku jest to pożądane zachowanie od tego czasurbindlist to szybsza implementacjarbind.

Uwaga 3: Jeśli teraz, obie kolumny są konwertowane na czynniki:

# 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

Tutaj kolumnax zDT.2 jest utracone (/ zastąpione przezDT.1). Jeśli kolejność zostanie odwrócona, dzieje się dokładnie odwrotnie (kolumna xDT.1 zostaje zastąpiony przezDT.2).

Ogólnie wydaje się, że istnieje problem z obsługąfactor kolumny wrbindlist.

questionAnswers(2)

yourAnswerToTheQuestion