2011-02-01 18 views
5

Tengo un vector numérico, digamos algo así como:recodificación numérica vectorial R

x <- rep(1:6, 300) 

Lo que me gustaría hacer es recodificar el vector, en su lugar tal que 6 = 1,5 = 2,4 = 3,3 = 4,2 = 5,1 = 6. No quiero crear un factor de eso.

Todo lo que he probado hasta ahora me da los recuentos erróneos debido a la orden, es decir:

x[x == 6] <- 1 
x[x == 5] <- 2 ## Lines that follow where x[x == 2] removes 5's entirely from counts. 

Nota: Estoy al tanto del paquete de coche, pero preferiría usar base de R para este problema .

+2

Creo que podría crear una nueva columna y hacer algo como abs (7-x [1]) –

Respuesta

4

construir un mapa entre los valores antiguos y nuevos, y un subconjunto con el viejo,

(6:1)[x] 
+0

Se adapta a algo más que mi caso de uso particular. –

4

Consulte el manual de car::recode. De lo contrario, crear variables y:

y <- numeric() 
length(y) <- length(x) 
y[x == 6] <- 1 
y[x == 5] <- 2 
## ad nauseam... 

Siempre es considerada una mala práctica para recodificar las variables en su lugar, porque si usted complicar las cosas, lo que probablemente va a perder datos. Ten cuidado.

5

¿No sería algo tan simple como 7 - x darle lo que está buscando?

+0

A veces, me imagino estas cosas solo por escribir mi problema de f o alguien más para responder! ¡Gracias! –

3

En su caso, sí, restarlo. En general, match puede ser bastante útil en casos como este. Por ejemplo, suponga que desea recodificar los valores de esta columna x a los valores de la columna y

> d <- data.frame(x=c(1,3,4,5 ,6),y=c(3,4,2.2,1,4.6)) 
> print(d, row.names=FALSE) 
x y 
1 3.0 
3 4.0 
4 2.2 
5 1.0 
6 4.6 

entonces esto sería recodificar los valores en a a los nuevos valores.

> a <- c(3,4,6,1,5) 
> d$y[match(a,d$x)] 
[1] 4.0 2.2 4.6 3.0 1.0 
+0

'match' solo devuelve la primera coincidencia, por lo que solo funciona si no hay valores repetidos. –

+0

Pero si hay valores repetidos, ¿cómo elegiríamos cuál de ellos recodificar? – Aaron

+0

En realidad, este es otro problema que estoy enfrentando. Ahora que tengo esta parte ordenada. –

1

rev(x) ... al menos cuando la longitud es un múltiplo par de la secuencia.

+0

Eso no funciona, porque cambia el orden. –

+0

'> all (rev (x) == (7-x)) # [1] TRUE' –

+0

que es simplemente un artefacto de los datos generados aquí. Considere los datos que no están ordenados tan bien: 'x <- c (1,1,2,3,4,5,6,1); todo (rev (x) == (7 - x)) ' – Chase

0

si desea volver a codificar múltiples variables que podría adoptar el siguiente enfoque:

MapFunc = function(x) { 
    y = NULL; 
     if (x %in% c("1","2","3")) {y=100} 
     if (x %in% c("0","4")) {y=200} 
     if (x %in% c("5")) {y=100} 
    print(y) 
    } 
    MapFunc(x=1); MapFunc(x=0); #working ok for scalars 
#
X = matrix(sample(0:5,25,replace=TRUE), nrow=5,ncol=5) 
apply(X,c(1,2),MapFunc) #working ok for matrices...