R:根据数据计数生成直方图

时间:2012-11-20 01:54:06

标签: r

假设我有向量a

c(1, 6, 2, 4.1, 1, 2)

计数向量b

c(2,3,2,1,1,0)

我想生成向量c

c(1, 1, 6, 6, 6, 2, 2, 4.1, 1)

致电:

hist(c)

如何构建c,或者是否可以直接从ab生成直方图?请注意a中的重复项,以及不等间距。

需要矢量化解决方案。 ab对于朋友和朋友来说太大了。

3 个答案:

答案 0 :(得分:10)

?rep

> rep(a, b)
[1] 1.0 1.0 6.0 6.0 6.0 2.0 2.0 4.1 1.0
> 

编辑,因为我很好奇!

a <- sample(1:10, 1e6, replace=TRUE)
b <- sample(1:10, 1e6, replace=TRUE)

> system.time(rep(a, b))
   user  system elapsed 
  0.140   0.016   0.156 
> system.time(inverse.rle(list(lengths=b, values=a)))
   user  system elapsed 
  0.024   0.004   0.028 

答案 1 :(得分:5)

只是为了与rep不同的东西:

> inverse.rle(list(lengths=b,values=a))
[1] 1.0 1.0 6.0 6.0 6.0 2.0 2.0 4.1 1.0

答案 2 :(得分:4)

一些基准测试和更快的解决方案。 rep.int是标准用例中rep的更快实现(来自?rep

rep.int(a, b)

我不相信上面的基准测试

inverse.rle只是rep.int的包装器。 rep.int应该比rep更快。我认为wrapper的{​​{1}}分量应该比inverse.rle作为原始函数的解释慢

一些微基准测试

rep()

其中没有多少,但library(microbenchmark) microbenchmark(rep(a,b), rep.int(a,b), inverse.rle(list(values = a, lengths =b))) Unit: milliseconds expr min lq median uq 1 inverse.rle(list(values = a, lengths = b)) 29.06968 29.26267 29.36191 29.67501 2 rep(a, b) 25.65125 25.76246 25.84869 26.52348 3 rep.int(a, b) 20.38604 23.31840 23.38940 23.69600 max 1 72.80645 2 69.00169 3 66.40759 似乎是赢家 - 它应该是。