这是一个有趣的问题 - 我很想知道对此的其他想法。查看 for 的源代码table()
表明它是基于tabulate()
. tabulate()
显然有一些怪癖,即它只处理正整数并返回一个没有名称的整数向量。我们可以unique()
在我们的向量上使用来应用names()
. 如果您需要将零值或负值制成表格,我想返回并进行审查table()
是必要的,因为tabulate()
根据帮助页面上的示例似乎没有这样做。
table2 <- function(data) {
x <- tabulate(data)
y <- sort(unique(data))
names(x) <- y
return(x)
}
快速测试:
> set.seed(42)
> sampData <- sample(1:5, 10000000, TRUE, prob = c(.3,.25, .2, .15, .1))
>
> system.time(table(sampData))
user system elapsed
4.869 0.669 5.503
> system.time(table2(sampData))
user system elapsed
0.410 0.200 0.605
>
> table(sampData)
sampData
1 2 3 4 5
2999200 2500232 1998652 1500396 1001520
> table2(sampData)
1 2 3 4 5
2999200 2500232 1998652 1500396 1001520
编辑:我刚刚意识到有一个count()
函数plyr
是table()
. 在上面的测试中,它的性能比table()
我提出的 hack-job 解决方案好,但略差:
library(plyr)
system.time(count(sampData))
user system elapsed
1.620 0.870 2.483