Recodificar el valor de un factor en R

7 Dic

Tras leer una duda planteada en la lista de R-Help en español me he animado a crear una entrada acerca de la recodificación de factores en R. Así dejo recogido algún código/truco que puede serviros en vuestro trabajo con R y que este pequeño problema no afecte a vuestra productividad. Además os acerco a la función recode del paquete car. Pero en primer lugar os planteo como recodificar factores empleando IF/ELSE:


#Datos de ejemplo:
dt = rpois(200,3)
#Empleamos el bucle for
for (i in 1:length(dt)){
if (dt[i]<=1) {dt0[i]='Tipo 1'} else
if (dt[i]==2) {dt0[i]='Tipo 2'} else
if (dt[i]==3) {dt0[i]='Tipo 3'} else
{dt0[i]='Tipo 4'}}
table(dt0)

Realizamos un bucle FOR con R que recoge el objeto dt que hace de ejemplo. Este sería el método más habitual junto con el uso de la función ifelse. Pero el paquete car contiene una función muy interesante y que nos permite ahorrar complicaciones y líneas de código:

library(car)
dt1 = recode(dt,"c(0,1)='Tipo 1';2='Tipo 2';3='Tipo 3';else='Tipo 4'")
table(dt1)

Fácil de recordar. Podemos recodificar un factor (NA=0), un vector (c(0,1)=’Tipo 1′) o un rango de valores (4:max(dt)=’Tipo 4). Bajo mi punto de vista es la opción más recomendable cuando queremos reagrupar factores. También tenemos la función as.item del paquete memisc, no estoy acostumbrado a usarla pero os planteo el mismo ejemplo con ella:

library(memisc)
dt2 = as.item(dt,labels=c( 'Tipo 1'=0, 'Tipo 1'=1, 'Tipo 2'=2, 'Tipo 3'=3,
'Tipo 4'=4, 'Tipo 4'=5,'Tipo 4'=6,'Tipo 4'=7,'Tipo 4'=8,'Tipo 4'=9,'Tipo 4'=10))
table(dt2)
summary(dt2)

Tras ejecutar el código entenderéis porque no la uso. Espero que haya respuestas a esta entrada con otras posibilidades o que alguien me justifique el empleo del as.item, saludos.

5 respuestas a «Recodificar el valor de un factor en R»

  1. Hola.

    Resulta muy útil ver todas estas cosas juntas. Tampoco entiendo la lógica resultante de as.item, pero seguro que alguien quiere las cosas así.

    Veo un problemilla en tu ejemplo, y es que dt0 no es un factor, el ejemplo funciona porque table convierte las variables de cadena a factores, pero habitualmente tendremos factores que tienen sus propias peculiaridades. Si se hace dt0 <- factor(dt0) después del bucle, es suficiente. También debería definirse dt0 antes de empezar para que corra: dt0 <- NULL antes del for.

    Echo de menos un «truco» importante con factores, que es usar el argumento drop=TRUE para eliminar los niveles del factor que no tienen observaciones, cosa habitual después de recodificar. La función recode de car lo hace automáticamente, pero si se recodifica a mano, es útil. Un ejemplo:

    xx <- factor(sample(c(«a», «b», «c»), 10, replace=TRUE))
    table(xx)
    xx[xx==»c»] <- «b»
    table(xx)
    xx <- xx[drop=TRUE]
    table(xx)

    • Hola. Estoy teniendo un problema. Tengo una variable con 3 niveles: Alto Bajo y Moderado y necesito juntar Alto y Moderado pero no he podido lograrlo con recode. Tendre q pasarlo a numero y desp recodificar ? Gracias

  2. Qué es dt0

    Cuando corro el script:
    Error in table(dt0) : object ‘dt0’ not found

    No has creado el objeto, cómo sería lo correcto ¿?

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *