如何让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))
答案 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。