# Codificación y Transformación

Como ya hemos visto brevemente en el capítulo de tipos de variables, normalmente los datos de un archivo necesitarán ser cuidadosamente preparados antes de poder aplicar, con las mínimas garantías, cualquier análisis estadístico.&#x20;

La preparación del archivo de datos incluye desde la simple detección y corrección de los posibles errores cometidos al introducir los datos, hasta sofisticadas transformaciones, pasando por la recodificación de los códigos utilizados para los valores de una o más variables, o la creación de nuevas variables a partir de otras ya existentes.&#x20;

Para ilustrar esta parte, vamos a leer la siguiente base de datos:

{% code fullWidth="false" %}

```r
students_dataframe <- read.csv("https://pos.it/r4ds-students-csv")
students_dataframe
```

{% endcode %}

<figure><img src="/files/QO7iSx1XYWS0edTE2jbD" alt="" width="563"><figcaption></figcaption></figure>

Ahora tendremos que comprobar que los datos se han leído correctamente y no tienen errores

## Detección inicial de errores

1. Columna favourite.food tiene un N/A que no está detectado como dato "missing"

```r
students_dataframe$favourite.food<-replace(students_dataframe$favourite.food,3,NA)
students_dataframe
```

<figure><img src="/files/3LsKuKKSuu4VZlmvlR9S" alt="" width="563"><figcaption></figcaption></figure>

Cuando queremos hacer muchos cambios a la vez porque por ejemplo no se hayan detectado los datos faltantes como NA podemos usar el paquete dplyr

```r
#install.packages("dplyr")
library (dplyr)
students_dataframe <- mutate_all(students_dataframe, funs(replace(., .=="", NA)))
```

2. El nombre de las columnas debería tener un nombre consistente. Las dos palabaras que corresponden a la columnas: Student.ID, Full.Name y favourite.food están separadas por un . y mealPlan se diferencia por una mayúscula. Además todas están en minúsculas y AGE en mayúsculas. Para evitar futuros errores, los nombres deberán ser consistentes.

```r
colnames(students_dataframe)<-
    c("Student_id","Full_name","Favourite_food","Meal_plan","Age")
students_dataframe
```

<figure><img src="/files/DnyFXxS9EY63P8ctcN3E" alt="" width="563"><figcaption></figcaption></figure>

3. En la variable Age, una de las observaciones tiene "five" en vez del número, esto nos causará problemas a la hora de usar dicha variable como variable numérica.

```r
students_dataframe$Age<-
    replace(students_dataframe$Age,students_dataframe$Age=="five",5)
students_dataframe
```

<figure><img src="/files/MEteR1MSUAIepvHxQTlN" alt="" width="563"><figcaption></figcaption></figure>

4. La variable Meal\_plan es una variable categórica que en R la podríamos representar como factor. Primero vemos como ver el tipo de variables en R con la función <mark style="color:green;">**`str()`**</mark>

```r
str(students_dataframe)
```

<figure><img src="/files/RJLFySmfNziTrloh7V2e" alt=""><figcaption></figcaption></figure>

```r

students_dataframe$Meal_plan<-factor(students_dataframe$Meal_plan)
class(students_dataframe$Meal_plan)
# [1] "factor"
```

## Transformación de variables

En ocasiones nos puede interesar incorporar nuevas variables a nuestra base de datos.

**Ejemplo 1:** Cuando una base de datos contiene la fecha de nacimiento, es mucho más útil generar la edad, más fácil de interpretar, analizar como variable en si misma y manejar numéricamente

```r
fecha_nacimiento = as.Date(c("12/5/1985","18/1/1988","19/11/1987"),format="%d/%m/%Y")
round((Sys.Date()-fecha_nacimiento)/365)
# [1] 38 36 36

```

**Ejemplo 2**: Para este ejemplo vamos a utilizar el dataset <mark style="color:orange;">**riesgo.csv**</mark>

{% file src="/files/8iZiNCtMdQUO7kcjbzOB" %}

Queremos crear una variable en la base de datos <mark style="color:orange;">**riesgos.csv**</mark> que se llame **índice de masa corporal** que se obtiene de la siguiente forma:&#x20;

$$
IMC=peso(kg)/altura(m)^2
$$

```r
datos <- read.csv("riesgos.csv", header = T, sep = "\t")
datos[, "IMC"]  <- datos$peso / (datos$talla/100)^2
head(datos)
```

<figure><img src="/files/BUMvC7rKuIAtsIW6ojw0" alt="" width="563"><figcaption></figcaption></figure>

## Categorizar una variable cuantitativa en una cualitativa

Esta opción suele ser muy habitual ya que muchas veces querremos trabajar con las categorías de una variable en vez de la variable cuantitativa.&#x20;

**Ejemplo**: La variable cuantitativa IMC que acabamos de crear se suele usar en cuatro grupos:

* **bajo peso**: IMC <= 18.50
* **normal**: 18.5 < IMC <=25
* **sobrepeso**: 25 < IMC <= 30
* **obesidad**: IMC >30&#x20;

En realidad buscamos los siguientes tramos de edad: (minimo, 18.5], (18.5, 25], (25, 30], (30, máximo]

```r
summary(datos[,"IMC"])
datos[,"IMC_grupos"] <- cut(datos$IMC, breaks = c(14,18.5,25,30,34), labels = c("bajo peso", "normal", "sobrepreso", "obesidad"))
head(datos)
```

<figure><img src="/files/4YmMegxdvMsSwAGXxRRj" alt="" width="563"><figcaption></figcaption></figure>

¿Cuántas personas tenemos en cada uno de los grupos?

```r
table(datos$IMC_grupos)
```

<figure><img src="/files/2O3BPkoUqrDYLN30msv6" alt="" width="328"><figcaption></figcaption></figure>

## Recodificación de variables

Nos puede interesar trabajar de forma diferente sobre una de las variables que ya tenemos.&#x20;

**Ejemplo**: La variable contrato nos muestra el número de contratos que ha tenido una persona, pero para trabajar con esta variable queremos que sólo tenga dos categorías, por tanto, la vamos a recodificar juntando todos los contratos mayores que 1.

```r
datos$contrato2cat<-datos$contrato
datos$contrato2cat[datos$contrato>1]<-2
head(datos)
```

<figure><img src="/files/nKLvyzwVnqwKy9M6Ou1C" alt=""><figcaption></figcaption></figure>

Es una buena práctica recodificar siempre en distintas variables para no perder información.

Ahora es tu turno: Realiza los siguientes ejercicios:

{% content-ref url="/pages/G18DTDgPbwxIe4jcLZPc" %}
[Ejercicios](/depuracion-de-datos-tfg3/tema-1-analisis-exploratorio-de-datos/codificacion-y-transformacion/ejercicios.md)
{% endcontent-ref %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://silvia-pineda.gitbook.io/depuracion-de-datos-tfg3/tema-1-analisis-exploratorio-de-datos/codificacion-y-transformacion.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
