2012-08-20 24 views
14

Quiero entrelazar dos vectores del mismo modo y la misma longitud. Di:Alternar, entrelazar o entrelazar dos vectores

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

me gustaría entretejer o entrelazar estos dos vectores, para crear un vector que sería lo que es equivalente c(a[1],b[1],a[2],b[2],...,a[length(a)],b[length(b)])

Mi primer intento fue esto:

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

pero requiere rpois ser llamado muchas veces más de lo necesario.

Mi mejor intento hasta ahora ha sido para transformarla en una matriz y reconvertir de nuevo en un vector:

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

¿Hay una mejor manera de ir haciendo sobre él? ¿O hay una función en la base R que logra lo mismo?

+0

¿Puede usted por favor, elimine los elementos de respuesta de la pregunta? Se vuelve demasiado confuso si responde su propia pregunta en la pregunta. Puede editar la respuesta de @benbolker, o puede publicar una nueva respuesta. – Andrie

+0

@Andrie Hecho. Lo siento por eso. –

Respuesta

13

Su método rbind debería funcionar bien. También puede usar

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

porque R replicará automáticamente el vector de valores lambda a la longitud requerida. No hay mucha diferencia en la velocidad:

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 

y elegancia está en el ojo del espectador ... por supuesto, el método c(rbind(...)) funciona en general para construir vectores alternos, mientras que la otra solución es específica para rpois u otro funciones que replican sus argumentos de esa manera.

+0

Oh wow, eso nunca se me ocurrió. Tengo mucho camino por recorrer antes de pensar en R '. ¡Gracias! –

3

Algunas pruebas de velocidad, incorporando la respuesta de 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 
+0

Estoy bastante sorprendido de ver qué tan bien funciona el comando 'rbind' aquí. Me parece recordar useRs protestando fuertemente contra rbind y cbind como gobblers de memoria ... – AdamO

Cuestiones relacionadas