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