Acerca de… reemplazar valores en un vector en R

Hola.

Para sustituir elementos de un vector por otra cosa usamos

> replace()
> datos<-c("a1","a2","b1","b2","c1","c2","c3","a3","b3")
> datos
[1] "a1" "a2" "b1" "b2" "c1" "c2" "c3" "a3" "b3"
> replace(datos,datos=="c1"|datos=="c2"|datos=="c3","c")
[1] "a1" "a2" "b1" "b2" "c"  "c"  "c" "a3" "b3"

ojo, hay que asignar el resultado a algo, si no el resultado se queda en el limbo:

> datos.n<-replace(datos,datos=="c1"|datos=="c2"|datos=="c3","c")

Esto quiere decir: En el vector datos pon “c” en los lugares de datos que haya c1, c2 o c3.
Pero si datos fuera un factor…

> datos.f<-as.factor(datos)
> datos.f
[1] a1 a2 b1 b2 c1 c2 c3 a3 b3
Levels: a1 a2 a3 b1 b2 b3 c1 c2 c3

… y intentamos reemplazar por algo que no es uno de los niveles del factor nos hace perla.

> datos.n<-replace(datos.f,datos.f=="c1"|datos.f=="c2"|datos.f=="c3","c")
Mensajes de aviso perdidos
In `[<-.factor`(`*tmp*`, list, value = "c") :
invalid factor level, NAs generated

Lo que hay que hacer (lo que hago yo, mejor dicho) es convertir el factor en carácter o número o lo que sea  hacer el replace().

> datos.f<-as.character(datos.f)
> datos.n<-replace(datos.f,datos.f=="c1"|datos.f=="c2"|datos.f=="c3","c")
> datos.n
[1] "a1" "a2" "b1" "b2" "c"  "c"  "c"  "a3" "b3"

No olvidemos hacer el resultado factor de nuevo.

> datos.n<-as.factor(datos.n)

Recordad que los datos pueden ser vectores, filas o columnas de una matriz, filas o columnas de un dataframe, etc.

Pero qué pasa si queremos reemplazar por los valores de otro vector.

Supongamos que queremos reemplazar números por las letras del abecedario que hay en las posiciones que indican esos números (a-1, b-2, c-3, etc.)

Nuestros datos serian un vector de números

> datos<-c(1,2,5,7,3)
> datos
[1] 1 2 5 7 3

Y queremos que en cada numero R nos escriba la letra que está en esa posición en el abecedario.

Escribimos el abecedario

> abecedario<-c(letters)
> abecedario
[1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m"
[14] "n" "o" "p" "q" "r" "s" "t" "u" "v" "w" "x" "y" "z"

Asignamos nombres al vector del abecedario, pero ojo que sean character.

> names(abecedario)<-as.character(c(1:length(abecedario)))
> abecedario
1   2   3   4   5   6   7   8   9  10  11  12  13  14
"a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n"
15  16  17  18  19  20  21  22  23  24  25  26
"o" "p" "q" "r" "s" "t" "u" "v" "w" "x" "y" "z"

Hacemos un bucle.

> salida<-0
> for(x in 1:5) { salida[x]<-abecedario[names(abecedario)==datos[x]] }
> salida
[1] "a" "b" "e" "g" "c"

para cada valor de x (1-5) va a la posición x (1-5) del vector salida y le asigna el valor del vector abecedario cuyo nombre es igual al  valor del vector datos en la posición x.

Bueno, esto funciona, pero tengo un escozor en el cogote que me dice que podría ser mucho más sencillo.

Espero que os sea útil. Ya sabéis, las ideas, quejas y comentarios son bienvenidos.

jaume

Anuncios

4 pensamientos en “Acerca de… reemplazar valores en un vector en R

  1. Hola chicos, mi problema se concentra en reemplazar solo algunos valores de un data.frame que consta de 1000 filas con 90 columnas. Os explico mejor:

    x1 x2 x2….. x9
    1 a11 a12 a13 ….a19
    2 a21 a22 a23… a29
    . ……………..
    ………………
    9 a91 a92 a93… a99

    Suponed que quiero reemplazar el valor de a21 por b21, a23 por b23…. mis cambios son de tipo aleatorio es decir no conllevan orde. Pensé en hacerlos uno a uno con la funcion reemplace() pero es mucha faena dada lo amplio de mis datos. Alguna suguerencia??

    Gracias!!
    Ana

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s