transforma.variable.fnc

Copia, Pega y Adapta

datos = transforma.variable.fnc(datos, variable='V10',

nuevo.tipo='numerica' )

datos = transforma.variable.fnc(datos, variable='V10',

nuevo.tipo='entero')

datos = transforma.variable.fnc(datos, variable='V12',

nuevo.tipo='fecha',formato='%d-%m-%y'))

OBJETIVO

Transforma una variable definida por el usuario desde su clase originaria, a cualquier otra de tipo numérica, entera, factor o fecha.

  1. Transformar una variable caracter a la clase fecha.

  2. Transformar una variable tipo entero, numérica, etc a cualquier otra clase.

Transformar variable a tipo Fecha

La transformación de variables importadas de otras bases de datos ya sea excel, openoffice, spss, etc, tiene una especial complicación por la propia naturaleza y variedad de formatos en que estas suelen venir. Vamos a abrir una base de datos de excel con 3 formatos de fecha diferentes.

Tenemos en este ejemplo 3 formatos diferentes de los muchos posibles en lo que a las variables de fecha (date) se refieren.

  1. Las dos primeras son del tipo dia/mes/año hora:minuto

  2. Las dos siguientes son del tipo dia/mes/año

  3. Las dos últimas son del tipo hora:minuto

Vamos a leer el archivo externo formato_fechas.xls (previamente guardado en nuestro directorio de trabajo en formato excel 97-2003) de la forma habitual.

datos = lee.archivo.fnc('formato_fechas.xls')

*** El archivo excel formato_fechas.xls contiene 3 sujetos y 6 variables. ***

*** Se ha asumido la lectura de la hoja 1 de formato_fechas.xls . Si deseas leer ***

*** otra hoja de ese archivo, incluye el argumento que.hoja (Ej. que.hoja=2) ***

entrada1 salida1 entrada2 salida2 entrada3 salida3

1 1-7-12 18:23 1-7-12 19:23 7-1-12 8-1-12 18:23:00 19:23:00

2 5-10-10 12:30 5-10-10 14:45 10-5-10 10-6-10 12:30:00 14:45:00

3 11-8-11 21:18 11-8-11 23:09 8-11-11 8-11-12 21:18:00 23:09:00

Con la función nombres.var no solo podremos saber el nombre y columna de las variables de una base de datos sino que además nos indica la clase de formato a la que pertenece cada variable.

nombres.var(datos)

nombre numero tipo

1 entrada1 1 factor

2 salida1 2 factor

3 entrada2 3 factor

4 salida2 4 factor

5 entrada3 5 factor

6 salida3 6 factor

Todas las variables han sido leídas como factores (alfanuméricos). Necesitamos modificar la clase de estas variables desde la actual factor a la adecuada de fecha (POSIXct en R) esto lo haremos mediante la función transforma.variable.fnc.

datos=transforma.variable.fnc(datos, variable='entrada1',

nuevo.tipo='fecha')

*** Error. Si nuevo.tipo='fecha' debes obligatoriamente incluir ***

*** el argumento fecha con el formato actual de la misma: ***

*** Ej1. '1-7-12 18:23' formato='%d-%m-%y %H:%M'

*** Ej2. '1-7-2012 18:23' formato='%d-%m-%Y %H:%M'

*** Ej3. '7-1-12' formato='%d-%m-%y'

*** Ej4. '7-Ene-12' FORMATO NO SOPORTADO

*** Ej5. '8/11/11' formato='%d/%m/%y'

*** Ej6. '8-11-2011' formato='%d-%m-%Y'

*** Ej7. '11.25.2011' formato='%m.%d.%Y'

*** Ej8. '11.25.11' formato='%m.%d.%y'

*** Ej9. '18:23:00' formato='%H:%M:%S'

La función te informa de un error consistente en no haber indicado el argumento obligatorio formato cuando se solicita un nuevo formato tipo fecha. Además te aporta 9 ejemplos que pueden ser de gran utilidad para ayudarte a definir el formato adecuado para tus variables de fecha. De este modo vemos que que el formato del ejemplo 1 '%d-%m-%y %H:%M' es el adecuado para las dos primeras variables. El formato 3 '%d-%m-%y' para las dos siguientes y por último el formato 9 '%H:%M:%S' para las dos últimas.

Vamos a simular un error de formato al utilizar incorrectamente el formato 2 para la primera variable.

datos=transforma.variable.fnc(datos, variable='entrada1',

nuevo.tipo='fecha', formato='%d/%m/%y %H:%M')

*** Error. Es muy probable que el formato de fecha sea incorrecto ***

*** Revisa el formato introducido ***

*** Estos son tus 3 primeros datos: 1-7-12 18:23 5-10-10 12:30 11-8-11 21:18

*** y este el formato que has introducido: %d/%m/%y %H:%M

Hemos utilizado un formato incorrecto porque hemos asumido que el separador de campos de fecha era la barra (/) cuando en realidad una vez leído desde excel el carácter de separación de campo es el guión. Repetimos la llamada modificando adecuadamente el formato.

datos=transforma.variable.fnc(datos, variable='entrada1',

nuevo.tipo='fecha', formato='%d-%m-%y %H:%M')

*** Se ha modificado la clase de la variable entrada1

*** a la nueva clase de fecha (POSIXct)

*** Estos son tus 3 primeros valores transformados:

[1] "2012-07-01 18:23:00 GMT" "2010-10-05 12:30:00 GMT" "2011-08-11 21:18:00 GMT"

Repetiremos el proceso de transformación para el resto de las variables de fecha.

datos=transforma.variable.fnc(datos, variable=2,

nuevo.tipo='fecha', formato='%d-%m-%y %H:%M')

datos=transforma.variable.fnc(datos, variable=3,

nuevo.tipo='fecha', formato='%d-%m-%y')

datos=transforma.variable.fnc(datos, variable=4,

nuevo.tipo='fecha', formato='%d-%m-%y')

datos=transforma.variable.fnc(datos, variable=5,

nuevo.tipo='fecha', formato='%H:%M:%S')

datos=transforma.variable.fnc(datos, variable='salida3',

nuevo.tipo='fecha', formato='%H:%M:%S')

Solicitaremos nuevamente nombres.var de los datos para comprobar el cambio de clase de las variables al nuevo tipo de fecha (POSIXct). Con este cambio, ya podremos operar con nuestras variables de fecha y realizar las operaciones comunes del cálculo de diferencia de hora, días, años, etc entre dos o mas fechas.

nombres.var(datos)

nombre numero tipo

1 entrada1 1 POSIXct

2 salida1 2 POSIXct

3 entrada2 3 POSIXct

4 salida2 4 POSIXct

5 entrada3 5 POSIXct

6 salida3 6 POSIXct

Ya podemos operar con las 6 variables para calcular por ejemplo la diferencia temporal entre cada entrada y su salida.

datos$dif1=datos$salida1-datos$entrada1

datos$dif2=datos$salida2-datos$entrada2

datos$dif3=datos$salida3-datos$entrada3

head(datos)

entrada1 salida1 entrada2 salida2

1 2012-07-01 18:23:00 2012-07-01 19:23:00 2012-01-07 2012-01-08

2 2010-10-05 12:30:00 2010-10-05 14:45:00 2010-05-10 2010-06-10

3 2011-08-11 21:18:00 2011-08-11 23:09:00 2011-11-08 2012-11-08

entrada3 salida3 dif1 dif2 dif3

1 2012-04-10 18:23:00 2012-04-10 19:23:00 1.00 hours 1 days 1.00 hours

2 2012-04-10 12:30:00 2012-04-10 14:45:00 2.25 hours 31 days 2.25 hours

3 2012-04-10 21:18:00 2012-04-10 23:09:00 1.85 hours 366 days 1.85 hours


MUY IMPORTANTE

Cuando lees archivos de SPSS con variables de fecha, estas son incorrectamente interpretadas por R. Es obligatorio por tanto primero seleccionar en SPSS el formato de fecha deseado para la variable y segundo transformar esa variable dentro de SPSS a formato Cadena (caracter) antes de guardar el archivo para ser posteriormente leido mediante lee.archivo.fnc.

Otras transformaciones

En R es muy frecuente tener que modificar la clase de pertenencia de una variable. Las transformaciones mas frecuentes pueden ser de numérico a entero (sin decimales) o viceversa (hay muchas funciones que se comportan de manera diferente según la variable sea numérica (admite decimales) o entera. Partiremos de la base de datos efi.bfi de la librería psych que contiene 13 variables medidas en 231 sujetos. Las 5 primeras provienen del inventario de personalidad de Eysenck, las 5 siguientes del cuestionario Big 5 (Acomodación, Conciencia, Extraversión, Neuroticismo y Apertura), bdi (depresión de Beck) y las dos últimas son medidas de Ansiedad rasgo-estado. Todas ellas pertenecientes a la clase número entero.

head(epi.bfi)

nombres.var(epi.bfi)

head(epi.bfi)

epiE epiS epiImp epilie epiNeur bfagree bfcon bfext bfneur bfopen bdi

1 18 10 7 3 9 138 96 141 51 138 1

2 16 8 5 1 12 101 99 107 116 132 7

3 6 1 3 2 5 143 118 38 68 90 4

4 12 6 4 3 15 104 106 64 114 101 8

5 14 6 5 3 2 115 102 103 86 118 8

6 6 4 2 5 15 110 113 61 54 149 5


nombres.var(epi.bfi)

nombre numero tipo

1 epiE 1 integer

2 epiS 2 integer

3 epiImp 3 integer

4 epilie 4 integer

5 epiNeur 5 integer

6 bfagree 6 integer

7 bfcon 7 integer

8 bfext 8 integer

9 bfneur 9 integer

10 bfopen 10 integer

11 bdi 11 integer

12 traitanx 12 integer

13 stateanx 13 integer

Vemos que todas las variables son enteras. Vamos a suponer que deseamos transformar la primera variable epiE a la clase numérica.

epi.bfi=transforma.variable.fnc(epi.bfi, variable=1,

nuevo.tipo='numerica')

*** Se ha transformado la variable: epiE desde su version entero a su version: numerica ***

Resumen de la variable epiE

Min. 1st Qu. Median Mean 3rd Qu. Max.

1.00 11.00 14.00 13.33 16.00 22.00

nombres.var(epi.bfi)

nombre numero tipo

1 epiE 1 numeric

2 epiS 2 integer

3 epiImp 3 integer

4 epilie 4 integer

5 epiNeur 5 integer

6 bfagree 6 integer

7 bfcon 7 integer

8 bfext 8 integer

9 bfneur 9 integer

10 bfopen 10 integer

11 bdi 11 integer

12 traitanx 12 integer

13 stateanx 13 integer

Si quisiéramos transormar de forma automatizada todas las variables de la base de datos con una sola llamada a la función lo haríamos con un loop for de la siguiente manera:

for(i in 1:13)

epi.bfi=transforma.variable.fnc(epi.bfi, variable=i, nuevo.tipo='numerico')

Observa que el subíndice i valdrá desde 1 hasta 13 (número de variables de la base de datos). El bucle llamará a la función 13 veces pero en cada ocasión irá modificando la variable (i) que va a ser transrformada.

nombres.var(epi.bfi)

nombre numero tipo

1 epiE 1 numeric

2 epiS 2 numeric

3 epiImp 3 numeric

4 epilie 4 numeric

5 epiNeur 5 numeric

6 bfagree 6 numeric

7 bfcon 7 numeric

8 bfext 8 numeric

9 bfneur 9 numeric

10 bfopen 10 numeric

11 bdi 11 numeric

12 traitanx 12 numeric

13 stateanx 13 numeric

Ahora todas las variables pertenecen a la clase numérica. Este ejemplo continua utilizándose en la función grafica.panel.fnc.