2012-08-20 14 views
14

voglio intrecciare due vettori della stessa modalità e uguale lunghezza. Di ':alternative, intrecciano o interlacciati due vettori

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

vorrei intrecciare o intrecciare questi due vettori, per creare un vettore che sarebbe equivalentemente c(a[1],b[1],a[2],b[2],...,a[length(a)],b[length(b)])

Il mio primo tentativo era questo:

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

ma richiede rpois essere chiamato più volte del necessario.

mio miglior tentativo finora è stato quello di trasformarla in una matrice e riconvertire di nuovo in un vettore:

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

C'è un modo migliore per andare a farlo? O c'è una funzione in base di R che compie la stessa cosa?

+0

Potete rimuovere gli elementi di risposta da parte della domanda? Diventa troppo confuso se rispondi alla tua stessa domanda nella domanda. Puoi modificare la risposta di @benbolker oppure puoi postare una nuova risposta. – Andrie

+0

@Andrie Fatto. Mi dispiace per quello –

risposta

13

Il tuo metodo rbind dovrebbe funzionare bene. È inoltre possibile utilizzare

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

poiché R replica automaticamente il vettore di valori lambda alla lunghezza richiesta. Non c'è molta differenza di velocità:

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 

ed eleganza è negli occhi di chi guarda ... ovviamente, il metodo c(rbind(...)) funziona in generale per la costruzione di vettori che si alternano, mentre l'altra soluzione è specifico per rpois o altro funzioni che replicano i loro argomenti in quel modo.

+0

Oh, wow, che non si è verificato a me. Ho un modo per andare prima che io pensi in R '. Grazie! –

3

Alcuni test di velocità, che incorporano la risposta di 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

Sono abbastanza scioccato nel vedere quanto bene il comando 'rbind' lavora qui. Mi sembra di ricordare che i membri dell'RSS protestano molto fortemente e pensano che gli orrori della memoria ... – AdamO