2012-08-20 9 views
14

Ich möchte zwei Vektoren des gleichen Modus und gleicher Länge verschachteln. Sprich:Alternate, interweave oder interlace zwei Vektoren

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

ich diese beiden Vektoren verweben oder Interlace möchte, um einen Vektor zu erstellen, die in äquivalenter Weise c(a[1],b[1],a[2],b[2],...,a[length(a)],b[length(b)])

Mein erster Versuch wäre, war dies:

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

aber es erfordert rpois viel öfter als nötig aufgerufen werden.

Mein bester Versuch ist bisher in eine Matrix zu verwandeln und zurück in einen Vektor zurückzuverwandeln:

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

Gibt es eine bessere Art und Weise zu tun, es zu gehen? Oder gibt es eine Funktion in der Basis R, die dasselbe bewirkt?

+0

Können Sie die Elemente der Antwort der Frage entfernen, bitte? Es wird zu verwirrend, wenn Sie Ihre eigene Frage in der Frage beantworten. Sie können die Antwort von @benbolker bearbeiten, oder Sie können eine neue Antwort posten. – Andrie

+0

@Andrie Fertig. Das tut mir leid. –

Antwort

13

Ihre Methode rbind sollte gut funktionieren. Sie können auch

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

verwenden, weil R den Vektor der Lambda-Werte automatisch auf die erforderliche Länge repliziert. Es gibt nicht viel Unterschied in der Geschwindigkeit:

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 

und Eleganz liegt im Auge des Betrachters ... natürlich das c(rbind(...)) Verfahren zur Konstruktion abwechselnd Vektoren im Allgemeinen arbeitet, während die andere Lösung ist spezifisch für rpois oder andere Funktionen, die ihre Argumente auf diese Weise replizieren.

+0

Oh wow, das ist mir nie in den Sinn gekommen. Ich habe einen Weg zu gehen, bevor ich in R denke. Vielen Dank! –

3

Einige Geschwindigkeitstests unter Einbeziehung Ben Bolker Antwort:

> 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

Ich bin ziemlich schockiert zu sehen, wie gut der 'rbind'-Befehl hier funktioniert. Ich scheine mich daran zu erinnern, dass die Benutzer sehr stark protestieren und sich als Gedächtnisfresser fühlen ... – AdamO