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

R 有没有更好的方法获得与表(vec)相同的输出,其中vec是一个向量?,r,R,假设我有一个向量,我不知道它的唯一元素(这里是1和2) 原因:我很想知道是否有更好的方法。另外,我注意到在base实现中有一个for循环(除了.C调用)。我不知道这是否是一个大问题,但当我做类似的事情时 R> table(rep(1:1000,100000)) R需要很长时间。我相信这是因为100000这个庞大的数字。但是有没有办法让它更快呢 编辑除了Chase的答案之外,这也做得很好 R> rle(sort(sampData)) 这是一个有趣的问题——我很想看到关于这个问题的其

假设我有一个向量,我不知道它的唯一元素(这里是1和2)

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

R> table(rep(1:1000,100000))
R需要很长时间。我相信这是因为100000这个庞大的数字。但是有没有办法让它更快呢

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

R> rle(sort(sampData))

这是一个有趣的问题——我很想看到关于这个问题的其他想法。查看
table()
的源代码可以发现它是基于
tablate()
构建的
tablate()
显然有一些奇怪之处,即它只处理正整数,并返回一个没有名称的整数向量。我们可以在向量上使用
unique()
来应用
names()
。如果需要将零值或负值制成表格,我想有必要回顾一下
table()
,因为根据帮助页面上的示例,
tablate()
似乎无法做到这一点

table2 <- function(data) {
    x <- tabulate(data)
    y <- sort(unique(data))
    names(x) <- y
    return(x)   
    }

谢谢你的好办法。事实上,我也是这么想的。我很好奇是否有使用lappy或(出于我的喜好)使用plyr函数(summary等)的解决方案。(我知道Lappy不一定能提高速度)@suncoolsu-你看过
plyr
中的
count()
吗?我以前不知道,但你的评论让我无法找到它。可能是另一个可行的选择。嗯,
sort
inside
unique
是多余的;删除它会使此数据的
table2
速度提高3倍。@mbq-你说得对,我们可以
排序
外部
唯一
。我们确实需要排序,因为
unique
将返回此数据的
51432
,因此如果不对其进行排序,则不会给出正确的结果…尽管排序5个值与1M个值显然要便宜得多。很好的捕捉。很好的一点,它确实是整数所必需的;对于系数,您只需将
级别
复制到
表格
的输出。
R> rle(sort(sampData))
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 
library(plyr)
 system.time(count(sampData))
   user  system elapsed 
  1.620   0.870   2.483