0

如何让 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))
4

2 回答 2

7

此行为已在 1.8.9 版本中修复data.table您可以从R-forge下载最新版本或等待 1.9.0 发布 CRAN。

来自新闻

BUG修复

  • rbindlist() 现在可以正确绑定因子列,#2650
于 2013-08-25T07:56:33.827 回答
4

确实rbindlist没有很好地处理因素。

注意 "a" indataList[[1]]$f1的内部表示和 "b" in 的内部表示dataList[[2]]$f1都是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;请参阅转换 data.table 中的列类

于 2013-08-25T06:16:06.693 回答