我有几个data.tables
我想rbindlist
。这些表包含具有(可能缺失)级别的因素。然后rbindlist(...)
的行为与do.call(rbind(...))
不同:
dt1 <- data.table(x=factor(c("a", "b"), levels=letters))
rbindlist(list(dt1, dt1))[,x]
## [1] a b a b
## Levels: a b
do.call(rbind, list(dt1, dt1))[,x]
## [1] a b a b
## Levels: a b c d e f g h i j k l m n o p q r s t u v w x y z
如果我想保持关卡,我是否需要rbind
或是data.table
方式吗?
答案 0 :(得分:4)
我猜rbindlist
更快,因为它不会检查do.call(rbind.data.frame,...)
为什么不在绑定后设置级别?
Dt <- rbindlist(list(dt1, dt1))
setattr(Dt$x,"levels",letters) ## set attribute without a copy
来自?setattr
:
setattr()在许多情况下通过引用设置属性很有用,可以在任何对象或对象的一部分上使用,而不仅仅是data.tables。
答案 1 :(得分:2)
感谢你指出这个问题。自version 1.8.11起,它已被修复:
dt1 <- data.table(x=factor(c("a", "b"), levels=letters))
rbindlist(list(dt1, dt1))[,x]
#[1] a b a b
#Levels: a b c d e f g h i j k l m n o p q r s t u v w x y z