假设我有向量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
,或者有没有办法直接从a
and生成直方图b
?请注意 中的重复项a
以及不等间距。
需要矢量化解决方案。a
并且b
对于 lapply 和朋友来说太大了。
假设我有向量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
,或者有没有办法直接从a
and生成直方图b
?请注意 中的重复项a
以及不等间距。
需要矢量化解决方案。a
并且b
对于 lapply 和朋友来说太大了。
?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
只是为了不同的东西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
一些基准测试和更快的解决方案。rep.int
是rep
标准用例中更快的实现(来自?rep
)
rep.int(a, b)
我不相信上面的基准测试
inverse.rle
只是rep.int
. rep.int
应该比rep
. 我认为的wrapper
组件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
内容不多,但rep.int
似乎是赢家——它应该如此。