我试图比较几种方法的速度,以便按组获取汇总统计数据。但是,运行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
答案 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次)。