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
.