Acerca de… reemplazar valores en un vector en R

October 30, 2010
By

This post was kindly contributed by Acerca de... » R - go there to comment and to read the full post.

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


Filed under: open source, R Tagged: R cran

Tags: , ,

Comments are closed.