6

私がベクトルを持っているとしましょう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と不等間隔に注意してください。

ベクトル化されたソリューションが必要です。ラップリーや友達には大きすぎますab

4

3 に答える 3

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 
于 2012-11-20T01:58:29.030 に答える
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
于 2012-11-20T02:34:58.683 に答える
4

いくつかのベンチマークとより高速なソリューション。は、標準のユースケースでrep.intのより高速な実装です(から)rep?rep

rep.int(a, b)

上記のベンチマークについては確信が持てませんでした

inverse.rleの単なるラッパーですrep.intrep.intよりも高速である必要がありますrepwrapperの成分は、原始関数として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が、勝者のように見えます-そうあるべきです。

于 2012-11-20T05:08:00.430 に答える