为什么data.table行索引的for循环比data.frame慢?

时间:2014-01-09 23:14:54

标签: r indexing dataframe data.table

我肯定很困惑为什么按行索引访问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 

1 个答案:

答案 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.tabledata.frame的表现相当。