do.call(namespace:base)和rbindlist(namespace:data.table)不一样

时间:2013-08-25 05:25:32

标签: r data.table

如何让do.call(namespace:base)和rbindlist(namespace:data.table)表现相同。 rbindlist消除了因子水平,而do.call则没有。以下显示了问题

(dataList <- list(data.frame(f1=rep(c("a"), each=1),"c"=rnorm(2),"d"=rnorm(2)),
                      data.frame(f1=rep(c("b"), each=1),"c"=rnorm(2),"d"=rnorm(2))) )

(rbindlist.Data <- rbindlist(dataList)) # combines lists into ONE data.frame same as above
(do.call.Data <- do.call(rbind, dataList))

2 个答案:

答案 0 :(得分:7)

data.table版本1.8.9中已修复此问题。您可以从R-forge下载最新版本,或等待1.9.0点击CRAN。

来自NEWS

  

BUG FIXES

     
      
  • rbindlist()现在正确绑定因子列,#2650
  •   

答案 1 :(得分:4)

rbindlist确实不能很好地处理因素。

请注意dataList[[1]]$f1中“a”的内部表示和dataList[[2]]$f1中“b”的内部表示都是1;使用str(dataList)验证这一点。不幸的是,rbindlist将结合内部表示;使用str(rbindlist.Data)验证这一点。

解决方案是rbindlist个字符列,而不是因子列,除非您确定因子列使用完全相同的因子表示(具有相同的级别和标签)。一种方法是始终使用data.table

(dataList <- list(data.table(f1=rep(c("a"), each=1),"c"=rnorm(2),"d"=rnorm(2)),
                  data.table(f1=rep(c("b"), each=1),"c"=rnorm(2),"d"=rnorm(2))) )
(rbindlist.Data <- rbindlist(dataList))

产生所需的结果,因为data.table不会将字符串转换为因子。

您可以将原始代码与stringsAsFactors = FALSE一起使用(data.frame来电或使用options)。但是,我不建议这样做,因为从一开始就使用data.table没有任何伤害(并且有很多好处)。

如果您没有自己制作data.frame,则必须转换列类型。 data.table电话并不难;见Convert column classes in data.table