> class(v)
"numeric"
> length(v)
80373285 # 80 million
v
的条目是整数,均匀分布在0到100之间。
> ptm <- proc.time()
> tv <- table(v)
> show(proc.time() - ptm)
user system elapsed
96.902 0.807 97.761
为什么table
函数在此向量上这么慢?
此简单操作是否有更快的功能?
通过比较,bigtable
中的bigtabulate
函数是快速的:
> library(bigtabulate)
> ptm <- proc.time() ; bt <- bigtable(x = matrix(v,ncol=1), ccols=1) ; show(proc.time() - ptm)
user system elapsed
4.163 0.120 4.286
尽管bigtabulate
是一个很好的解决方案,但是仅仅为了这个简单的功能而采用特殊的程序包似乎很笨拙。从技术上讲,这会产生开销,因为我将向量扭曲成矩阵以使其与bigtable
一起使用。在基础R
中是否应该有一个更简单,更快的解决方案?
无论其价值如何,基本R
函数cumsum
都非常快,即使对于这个长向量也是如此:
> ptm <- proc.time() ; cs <- cumsum(v) ; show(proc.time() - ptm)
user system elapsed
0.097 0.117 0.214
答案 0 :(得分:3)
因为它首先调用factor
。如果您所有的输入都是整数,请尝试tabulate
。但是您需要加1,以便矢量值从1开始而不是0。