4

假设我有一个向量,但我不知道,先验,它的独特元素(这里:1 和 2)。

vec <-
  c(1, 1, 1, 2, 2, 2, 2)

我很想知道是否有更好的方法(或优雅的方法)来获取唯一元素的数量,vec即与table(vec). 它是 data.frame 还是命名向量都没有关系。

R> table(vec)
vec
1 2 
3 4 

原因:我很想知道是否有更好的方法。另外,我注意到实现中有一个for循环base(除了 .C 调用)。我不知道这是否是一个大问题,但是当我做类似的事情时

R> table(rep(1:1000,100000))

R需要很长时间。我确信这是因为 100000 的巨大数字。但是有没有办法让它更快?

编辑Chase's除了回答之外,这也做得很好。

R> rle(sort(sampData))
4

1 回答 1

9

这是一个有趣的问题 - 我很想知道对此的其他想法。查看 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()函数plyrtable(). 在上面的测试中,它的性能比table()我提出的 hack-job 解决方案好,但略差:

library(plyr)
 system.time(count(sampData))
   user  system elapsed 
  1.620   0.870   2.483
于 2010-12-20T03:18:59.257 回答