我肯定很困惑为什么按行索引访问data.table比data.frame慢。任何建议如何我可以在循环中顺序访问每一行data.table更快?
m = matrix(1L, nrow=100000, ncol=100)
DF = as.data.frame(m)
DT = as.data.table(m)
identical(DF[100, ], DT[100, ])
[1] FALSE
> all(DF[100, ], DT[100, ])
[1] TRUE
> system.time(for (i in 1:1000) DT[i,])
user system elapsed
5.440 0.000 5.451
R> system.time(for (i in 1:1000) DF[i,])
user system elapsed
2.757 0.000 2.784
答案 0 :(得分:6)
data.table
查询包含更多参数(并且更多),因此DT[...]
的小开销大于DF[...]
。如果你循环它,这个开销就会增加。 data.table
的预期用途是让它执行几次大型复杂操作,而不是多次执行小的平凡计算。所以让我们重新制定你的测试:
> system.time(DT[seq(len=nrow(m)),])
user system elapsed
0.08 0.02 0.09
> system.time(DF[seq(len=nrow(m)),])
user system elapsed
0.08 0.05 0.13
在这里,它们大致相同。由于我们只有一个DT调用,因此开销不是那么明显,因为开销只执行一次。在你的情况下,你执行了100K次(不必要的,我可能会添加)。如果您正在使用data.table
并且您正在拨打它数千次,那么您可能错误地使用了它。几乎肯定有一种方法可以重新制定,这样你就可以只进行一次或几次data.table
次调用。
另外,请注意,即使我在此重新制定的测试也非常简单,这就是为什么data.table
与data.frame
的表现相当。