2010-10-11 23 views
12

Ich möchte Werte in einem Vektor (x) durch Werte von einem anderen Vektor (y) ersetzen. Catch 22: Die Methoden müssen dynamisch sein, um verschiedene Anzahl von "Ebenen" in Vektor x unterzubringen. Betrachten wir zum Beispiel Vektor xErsetze Werte in einem Vektor basierend auf einem anderen Vektor

x <- sample(c(1, 2, 3, 4, 5), 100, replace = TRUE) 
> x 
    [1] 2 4 1 1 3 1 1 1 1 1 2 2 5 5 4 5 5 3 4 1 2 2 3 3 3 5 1 3 4 5 5 3 2 4 3 1 3 
[38] 1 4 5 4 1 4 5 4 5 2 4 2 5 3 4 3 1 2 1 1 5 1 4 2 2 5 2 2 4 5 2 4 5 2 5 4 1 
[75] 3 3 4 4 1 1 4 4 2 4 5 4 5 5 4 2 5 2 4 5 3 2 1 1 2 2 

wo Ich mag würde 1s mit 100, 2s mit 200 und so weiter ersetzen.

Dies kann leicht mit einer for-Schleife erfolgen, aber für große Vektoren, mehrere hunderttausend Werte, ist dies sehr ineffizient. Irgendwelche Tipps, wie Sie den Code optimieren können?

x <- sample(c(1, 2, 3, 4, 5), 100, replace = TRUE) 
y <- c(100, 200, 300, 400, 500) 
x.lvl <- c(1, 2, 3, 4, 5) 
x.temp <- x 

for (i in 1:length(y)) { 
    x.temp[which(x == x.lvl[i])] <- y[i] 
} 

Antwort

6

mit Faktoren arbeiten könnte schneller sein:

xf <- as.factor(x) 
y[xf] 

Hinweis, dass levels(xf) gibt Ihnen ein Zeichen Vektor ähnlich wie Ihre x.lvl. Damit diese Methode funktioniert, sollten die Elemente von y den entsprechenden Elementen von levels(xf) entsprechen.

+2

Im Spielzeug Beispiel könnten Sie sogar y verwenden [x] –

+2

Oder nur x * 100 :) – VitoshKa

+0

Perfect. Es funktioniert auch ohne Umwandlung in einen Faktor und erkennt, ob x mehr "Ebenen" als von y vorausgesehen hat. –

16

Versuchen mit match

y[match(x, x.lvl)] 
+0

Sie brauchen keine Übereinstimmung. verwenden Sie einfach y [x] –

+5

@Mahbub In diesem Fall ja, aber in der Regel müssen Sie übereinstimmen (z. B. wenn "x" ist ein Vektor von Buchstaben). Überprüfen Sie die Kommentare unten VitoshKa Antwort. – Marek

Verwandte Themen