具有数据表,tapply,聚合,ave和dplyr的微基准

时间:2016-06-04 01:07:08

标签: r data.table aggregate dplyr tapply

我试图比较几种方法的速度,以便按组获取汇总统计数据。但是,运行microbenchmark时出错。错误说明:

Error in bmerge(i, x, leftcols, rightcols, io, xo, roll, rollends, nomatch,  : 
  x.'TRIAL_INDEX' is a character column being joined to i.'TRIAL_INDEX' which is type 'integer'. Character columns must join to factor or character columns.

我不确定,但我认为data.table会更改变量attribute的{​​{1}}。从搜索TRIAL_INDEX搜索类似的问题,我猜一些软件包之间存在冲突。

是否有解决方法,所以我可以将Stack Overflow的属性更改回TRIAL_INDEX或采取其他操作以便integer功能正常工作?或许我正在犯一个我没有看到的错误。

以下是我试图比较的五个函数的代码。从运行这些函数的子集开始,microbenchmark函数的速度给我留下了深刻的印象。

ave

1 个答案:

答案 0 :(得分:2)

您可以完成的一项简单测试是向您的函数添加cat("In tapply")cat("In ave")等等,然后使用times = 1L再次运行以进行调试。

这样做,我明白了:

> microbenchmark(    tapply.function(poo),
+                    aggregate.function(poo),
+                    ave.function(poo),
+                    dplyr.function(poo), 
+                    data.table.function(poo), times = 1)
In dplyr
In tapply
Error in bmerge(i, x, leftcols, rightcols, io, xo, roll, rollends, nomatch,  : 
  x.'TRIAL_INDEX' is a character column being joined to i.'TRIAL_INDEX' which is type 'integer'. Character columns must join to factor or character columns.

错误发生在tapply函数。

让我们看一下该函数的前两行:

my.summary <- as.data.frame(do.call("rbind", tapply(poo$RIGHT_PUPIL_SIZE, 
                  poo$TRIAL_INDEX, function(x) c(index.mean = mean(x, na.rm = 
                        TRUE), index.sd =   sd(x, na.rm = TRUE)))))
my.summary$TRIAL_INDEX <- rownames(my.summary)
丁丁丁..我们是胜利者......

str(my.summary)
# 'data.frame': 2 obs. of  3 variables:
#  $ index.mean : num  7 3
#  $ index.sd   : num  2.58 1.83
#  $ TRIAL_INDEX: chr  "1" "2" ## <~~~ char type

这就是下一个merge上出现错误消息的原因。为什么?因为您在setDT(poo)中使用了data.table.function()(对象btw的奇怪名称),它通过引用修改了poo(?!?)。所有后续测试都将该对象用作data.table。

data.table.function()结束时,在返回ans之前,请使用setDF(poo),或者在该函数中使用as.data.table(poo),并分别对as.data.table(poo)的时间进行基准测试我们可以从data.table函数的时间中扣除转换时间。

所有这一切,在10行上,您很可能只是从data.frame - &gt;来衡量类型转换的开销。 data.table - &gt; data.frame。我不确定你可以从ns / us时间得到什么有意义的结论(除非你重复这个任务> 1,000或10,000次)。