是否有更好的方法获得与表(vec)相同的输出,其中vec是向量?

sun*_*lsu 4 r

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

vec <-
  c(1, 1, 1, 2, 2, 2, 2)
Run Code Online (Sandbox Code Playgroud)

我有兴趣知道是否有更好的方式(或优雅的方式)获得独特元素的数量,vec即相同的结果table(vec).无论是data.frame还是命名向量都无关紧要.

R> table(vec)
vec
1 2 
3 4 
Run Code Online (Sandbox Code Playgroud)

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

R> table(rep(1:1000,100000))
Run Code Online (Sandbox Code Playgroud)

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

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

R> rle(sort(sampData))
Run Code Online (Sandbox Code Playgroud)

Cha*_*ase 9

这是一个有趣的问题 - 我很想看到其他的想法.从源头table()上看,它揭示了它的基础tabulate().tabulate()显然有一些怪癖,即它只处理正整数并返回一个没有名字的整数向量.我们可以使用unique()我们的向量来应用names().如果你需要将零值或负值列表,我想回过头来进行检查table()是必要的,因为tabulate()根据帮助页面上的示例似乎没有这样做.

table2 <- function(data) {
    x <- tabulate(data)
    y <- sort(unique(data))
    names(x) <- y
    return(x)   
    }
Run Code Online (Sandbox Code Playgroud)

并快速测试:

> 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 
Run Code Online (Sandbox Code Playgroud)

编辑:我刚刚意识到有一个count()功能,plyr其中是另一种选择table().在上面的测试中,它比table()我放在一起的黑客作业解决方案表现得更好,也更糟糕:

library(plyr)
 system.time(count(sampData))
   user  system elapsed 
  1.620   0.870   2.483
Run Code Online (Sandbox Code Playgroud)

  • @suncoolsu - 你见过`plyr`的`count()`吗?我以前没有意识到这一点,但你的评论让我找不到它.可能是另一个可行的替代方案. (2认同)
  • 好吧,`unique`里面的`sort`是多余的; 删除它给了我这个数据3倍的"table2"加速. (2认同)