18

同じモードで同じ長さの 2 つのベクトルをインターレースしたいと考えています。言う:

a <- rpois(lambda=3,n=5e5)
b <- rpois(lambda=4,n=5e5)

これらの 2 つのベクトルを織り交ぜたり、織り交ぜたりして、同等のベクトルを作成したいと考えています。c(a[1],b[1],a[2],b[2],...,a[length(a)],b[length(b)])

私の最初の試みはこれでした:

sapply(X=rep.int(c(3,4),times=5e5),FUN=rpois,n=1)

しかし、必要rpois以上に何度も呼び出す必要があります。

これまでの私の最善の試みは、それを行列に変換し、ベクトルに再変換することでした:

d <- c(rbind(rpois(lambda=3,n=5e5),rpois(lambda=4,n=5e5)))
d <- c(rbind(a,b))

それを行うためのより良い方法はありますか?Rまたは、同じことを達成するbase の関数はありますか?

4

2 に答える 2

16

あなたのrbind方法はうまくいくはずです。使用することもできます

rpois(lambda=c(3,4),n=1e6)

R はラムダ値のベクトルを必要な長さに自動的に複製するためです。速度に大きな違いはありません:

library(rbenchmark)
benchmark(rpois(1e6,c(3,4)),
     c(rbind(rpois(5e5,3),rpois(5e5,4))))


#                                        test replications elapsed relative
# 2 c(rbind(rpois(5e+05, 3), rpois(5e+05, 4)))          100  23.390 1.112168
# 1                      rpois(1e+06, c(3, 4))          100  21.031 1.000000

エレガンスは見る人の目にあります...もちろん、この方法は一般的に代替ベクトルを構築するために機能しますが、他のソリューションはそのように引数を複製する関数または他の関数にc(rbind(...))固有のものです。rpois

于 2012-08-20T20:28:32.160 に答える
4

Ben Bolkerの回答を組み込んだいくつかの速度テスト:

 benchmark(
 c(rbind(rpois(lambda=3,n=5e5),rpois(lambda=4,n=5e5))),
 c(t(sapply(X=list(3,4),FUN=rpois,n=5e5))),
 sapply(X=rep.int(c(3,4),times=5e5),FUN=rpois,n=1),
 rpois(lambda=c(3,4),n=1e6),
 rpois(lambda=rep.int(c(3,4),times=5e5),n=1e6)
 )
                                                                  test
1 c(rbind(rpois(lambda = 3, n = 5e+05), rpois(lambda = 4, n = 5e+05)))
2                 c(t(sapply(X = list(3, 4), FUN = rpois, n = 5e+05)))
4                                   rpois(lambda = c(3, 4), n = 1e+06)
5           rpois(lambda = rep.int(c(3, 4), times = 5e+05), n = 1e+06)
3      sapply(X = rep.int(c(3, 4), times = 5e+05), FUN = rpois, n = 1)
  replications elapsed   relative user.self sys.self user.child sys.child
1          100    6.14   1.000000      5.93     0.15         NA        NA
2          100    7.11   1.157980      7.02     0.02         NA        NA
4          100   14.09   2.294788     13.61     0.05         NA        NA
5          100   14.24   2.319218     13.73     0.21         NA        NA
3          100  700.84 114.143322    683.51     0.50         NA        NA
于 2012-08-20T22:55:02.953 に答える