gpt4 book ai didi

r - 有没有更好的方法来获得与 table(vec) 相同的输出,其中 vec 是向量?

转载 作者:行者123 更新时间:2023-12-04 23:05:49 24 4
gpt4 key购买 nike

假设我有一个向量,但我不知道,先验,它的唯一元素(这里是: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))

最佳答案

这是一个有趣的问题 - 我很想知道关于这个的其他想法。查看 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()函数在 plyr这是 table() 的另一种选择.在上面的测试中,它的性能优于 table() ,并且比我放在一起的 hack-job 解决方案略差:
library(plyr)
system.time(count(sampData))
user system elapsed
1.620 0.870 2.483

关于r - 有没有更好的方法来获得与 table(vec) 相同的输出,其中 vec 是向量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12481415/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com