假设我有一个向量,我不知道,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)
这是一个有趣的问题 - 我很想看到其他的想法.从源头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)
| 归档时间: |
|
| 查看次数: |
43 次 |
| 最近记录: |