reorder.factor.fnc

Copy, Paste and Adapts

dat = reorder.factor.fnc(dat, which.factor='treatment', new.levels=c('control','A','B') )

dat = reorder.factor.fnc(dat, which.factor='rt.r', new.levels=c('Q1','Q4'), make.NA=T)

Objetive

Permite cambiar el orden de los niveles de un factor desde su ordenamiento por defecto de carácter alfabético a un nuevo orden definido por el usuario. Otra de las opciones de gran utilidad de esta función esta en eliminar (haciendo NA) aquellos niveles de un factor que el usuario desee. Asimismo permite cambiar la clase de pertenencia de una variable (numeríca, entera o carácter) a la clase factor.

Reordering a factor

Partiremos de la base de datos iris de la librería MASS la cual contiene 4 medidas realizadas en 150 plantas pertenecientes a 3 especies medidas con la variable Species.

Si pedimos la distribución de frecuencias de la variable Species veremos que los niveles están ordenados alfabéticamente. Vamos a reordenar dichos niveles de forma diferente (no alfabética).

frequency.fnc(iris, variables='Species')

#------------------------------------------------------------------

# TABLE OF FRECUENCY

#------------------------------------------------------------------

$Species

$Species$n.total

[1] 150

$Species$table

setosa versicolor virginica

50 50 50

iris= reorder.factor.fnc(iris, which.factor='Species',

new.levels=c('virginica','versicolor','setosa') )

frequency of Species (unrearranged)

Species reordered

Ahora el factor Species presenta el orden no alfabético deseado. Esto es especialmente útil cuando los niveles que aparecen en una gráfica o tabla no tiene el orden deseado por el usuario. Si tenemos 3 grupos definidos por niveles alto, medio y bajo los niveles se ordenaran alto, bajo y medio lo cual obviamente no sigue el ordenamiento real de dichos niveles. La solución por tanto estaría en reordenarlos siguiendo el procedimiento descrito.

Eliminating a factor levels

En muchas otras ocasiones lo que el usuario desea es impedir que ciertos niveles de un factor entren en un determinado análisis. Podemos pensar que la mejor solución para este objetivo sería filtrar los datos mediante un subset y trabajar con la base de datos resultante. Veamos que ocurriría si actuásemos así. Vamos a seleccionar a modo de ejemplo los niveles versicolor y virginica (dejaremos fuera el nivel setosa)

iris2= subset(iris, Species != 'setosa')

Pedimos ahora la distribución de frecuencias de Species en la nueva base de datos filtrada iris2.

frequency.fnc(iris2, variables='Species', graphic=T)

Unwanted setosa level still appears

Puedes ver como el nivel setosa sigue apareciendo (con valor 0) tanto en la distribución de frecuencias de la variable Species como en la gŕafica de barras de dichas frecuencias. Obviamente cualquier análisis que realicemos con esta variable contemplará dicho nivel aunque con valor cero, generando graves problemas de estimación si nos encontrásemos por ejemplo en un contexto de análisis discriminante, Anovas, etc. La solución consiste en "reordenar" el factor eliminando los niveles no deseados del argumento new.levels.

iris2= reorder.factor.fnc(iris, which.factor='Species',

new.levels=c('virginica','versicolor' ) )

Esta instrucción te generará un error porque la función detecta que los niveles declarados están incompletos (observa la figura inferior). Lo solucionamos incluyendo la propuesta que el propio mensaje de error te da de incluir el argumento make.NA=T

iris2= reorder.factor.fnc(iris, which.factor='Species',

new.levels=c('virginica','versicolor') ,

hacer.NA=T)

error al reordenar menos niveles de los reales.

al incluir hacer.NA=T reordena adecuadamente

Si solicitamos ahora la distribución de frecuencias anterior veremos que el nivel setosa ha desaparecido completamente del factor Species. Ahora podemos utilizar esa variable como factor de agrupación en un Análisis discriminante o como factor intergrupo en un Anova con la garantía de que solo intervendrán los niveles deseados.

frequency.fnc(iris2, variables='Species', graphic=T)

From numeric to factor

En ocasiones con bases de datos importadas las variables en origen categóricas vienen en versión numérica (por ejemplo sexo: hombre 1 mujer 2) en otras la variable siendo categórica con etiquetas alfanuméricas está en versión caracter y no factor como sería adecuado para su utilización con factor intergrupo en un Anova o variable de agrupación en un análisis discriminante. La función reorder.factor.fnc puede también modificar la clase de una variable a la nueva condición de factor.

Seguidamente crearemos una pequeña base de datos con 10 valores donde simularemos dos variables: sexo en su versión numérica (1 y 2) y nota tipificada).

test= data.frame(sex=rep(c(1,2), each=5), nota =rnorm(10))

> test

sex x

1 1 0.3481685

2 1 -0.5842693

3 1 -0.1889138

4 1 0.7612768

5 1 -0.1615658

6 2 0.3843339

7 2 -2.6769726

8 2 -1.1109847

9 2 1.2623528

10 2 1.1588194

> var.names(test)

name column type

1 sex 1 numeric

2 nota 2 numeric

Vamos a transformar el tipo (clase) de la variable sex (numérica) a su versión factor.

test= reorder.factor.fnc(prueba, which.factor='sex',

new.levels=c(1,2))

#------------------------------------------------------------------

# REORDER FACTOR'S LEVELS

#------------------------------------------------------------------

$make.NA

[1] FALSE

$niveles.old.names

[1] "1" "2"

$niveles.nuevos

[1] "1" "2"

*** Table of frequencies with the new order:

1 2

5 5

var.names(test)

name column type

1 sex 1 factor

2 nota 2 numeric

Up ->