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
Te complicas la vida, R es mucho más sencillo. Tu ejemplo de reemplazar números por letras del abecedario:
datos<-c(1,2,5,7,3)
letters[datos]
hola Podrias explicar como exactamente remplazo los numeros por letras
Hola Juli,
Ya sabía yo que había alguna forma más sencilla de hacerlo… pero no tan sencilla.
Muchas gracias.
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
Hola Ana,
La verdad es que no estoy seguro de como podría hacerse. De hecho es un problema que tengo, no se como hacerlo de una forma rápida si hay muchos valores a sustituir.
Por que no te suscribes a la lista de R y preguntas allí.
https://stat.ethz.ch/mailman/listinfo/r-help-es
jaume
Hola;
¿Cómo podría reemplazar NA, por un numero?
Tienes que usar, is.na() p.e. https://stackoverflow.com/questions/8161836/how-do-i-replace-na-values-with-zeros-in-an-r-dataframe