Альтернативные, переплетенные или чередующиеся два вектора
Я хочу чередовать два вектора одного и того же режима и равную длину. Скажи:
a <- rpois(lambda=3,n=5e5)
b <- rpois(lambda=4,n=5e5)
Я хотел бы переплетать или чередовать эти два вектора, чтобы создать вектор, который был бы эквивалентен 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
, которая выполняет одно и то же?
Ответы
Ответ 1
Ваш метод 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
или других функций, которые реплицируют свои аргументы в том, что путь.
Ответ 2
Некоторые тесты скорости, включая ответ Бена Болкера:
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