2010-10-11 24 views
12

Me gustaría reemplazar los valores en un vector (x) con los valores de otro vector (y). Captura 22: los métodos deben ser dinámicos para adaptarse a diferentes números de "niveles" en el vector x. Por ejemplo, considere el vector de xreemplazar valores en un vector basado en otro vector

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 

donde me gustaría reemplazar 1s con 100, 2s con 200 y así sucesivamente.

Esto se puede hacer fácilmente con un bucle for pero para vectores grandes, varios 100 mil valores, esto es altamente ineficiente. ¿Algún consejo sobre cómo optimizar el código?

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] 
} 

Respuesta

6

Trabajar con factores podría ser más rápido:

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

Nota, que levels(xf) le da un carácter vectorial similar a su x.lvl. Por lo tanto, para que este método funcione, los elementos de y deberían corresponder a los elementos apropiados de levels(xf).

+2

En el ejemplo de juguete incluso se podría utilizar y [x] –

+2

O, simplemente x 100 * :) – VitoshKa

+0

perfecto. Funciona incluso sin convertir a un factor y detecta si x tiene más "niveles" que los previstos por y. –

16

intento con match

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

No es necesario que coincida. simplemente use y [x] –

+5

@Mahbub En este caso sí, pero en general necesita concordancia (por ejemplo, si 'x' es un vector de letras). Ver comentarios debajo de la respuesta de VitoshKa. – Marek

Cuestiones relacionadas