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

R:根据数据计数生成直方图,r,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,或者是否有一种直接从a和b生成直方图的方法?请注意a中的重复项以及不等间距 需要矢量化的解决方案a和b对于Lappy和朋友来说太大了。?rep > rep(a, b) [1] 1.0 1.0 6.0 6.0 6.0 2.0 2.0 4.1 1.0 >

假设我有向量
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
b
生成直方图的方法?请注意
a
中的重复项以及不等间距

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

?rep

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

编辑,因为我很好奇

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 
a system.time(inverse.rle(列表(长度=b,值=a)))
用户系统运行时间
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

我不相信上面的基准测试

inverse.rle
只是
rep.int
的包装
rep.int
应该比
rep
快。我认为
reverse.rle
wrapper
组件应该比
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
似乎是赢家——它应该是赢家。

请参见我的文章的编辑。您的
inverse.rle
版本速度明显更快@贾斯汀,看我的帖子——不应该,也不是。我会被诅咒的,我没想到!相对而言,这是一个很好的提速,但无论如何也不一定要等一整天!那次加速没有按我预期的方向进行!但是rep只需要输入3个字符;无论哪种方式,绝对时间都很快,所以字符数对我来说都是有利的。因此,接受的解决方案保留为'internal'的.rep.int;不是“整数”;哦,R命名约定。。。非常感谢使用microbenchmark工具的帖子;今天晚上我确实学到了一些东西。