6

我有几个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办法?

4

2 回答 2

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。

于 2013-10-18T14:08:17.113 回答
2

感谢您指出这个问题。从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
于 2013-10-27T20:54:42.483 回答