rbindlist表示缺少级别的因素

时间:2013-10-18 13:36:11

标签: r data.table

我有几个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方式吗?

2 个答案:

答案 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