1 of 48

Manipulación de datos

Tidy data

2 of 48

Almacena datos en una forma consistente

Cada columna una variable

Cada fila es una observación

3 of 48

Tidy data

  • Una forma tabular de organizar los datos

4 of 48

Tidy data

  • Una forma tabular de organizar los datos

5 of 48

Tidy data

  • Una forma tabular de organizar los datos
  • Provee consistencia entre diferentes librerías
  • Formato apropiado para agregar, visualizar y modelar
  • Complementa las operaciones vectorizadas en R → R conservará automáticamente las observaciones a medida que manipule las variables.

6 of 48

Tidy data

  • Una forma tabular de organizar los datos
  • Provee consistencia entre diferentes librerías
  • Formato apropiado para agregar, visualizar y modelar
  • Complementa las operaciones vectorizadas en R → R conservará automáticamente las observaciones a medida que manipule las variables.

7 of 48

Tidy data

  • Una forma tabular de organizar los datos
  • Provee consistencia entre diferentes librerías
  • Formato apropiado para agregar, visualizar y modelar
  • Complementa las operaciones vectorizadas en R → R conservará automáticamente las observaciones a medida que manipule las variables.
  • Es intuitivo

8 of 48

La siguiente tabla muestra el números de veces que tres especies de peces fueron capturados con línea de mano

Especie

Presencia

Ausencia

pintadilla

1

4

tramboyo

3

2

lenguado

5

0

¿Cuántas variables puedes observar?

9 of 48

La siguiente tabla muestra el números de veces que tres especies de peces fueron capturados con línea de mano

Especie

Presencia

Ausencia

pintadilla

1

4

tramboyo

3

2

lenguado

5

0

¿Cuántas variables puedes observar?

  1. La especie
  2. La ocurrencia con 2 niveles
  3. El valor actual de los niveles

10 of 48

La siguiente tabla muestra el números de veces que tres especies de peces fueron capturados con línea de mano

Especie

Presencia

Ausencia

pintadilla

1

4

tramboyo

3

2

lenguado

5

0

¿Cómo podrías acceder a los elementos

  • para obtener las categorías de ocurrencia?
  • para obtener la lista de especies?
  • para obtener todos los valores en un vector?

11 of 48

La siguiente tabla muestra el números de veces que tres especies de peces fueron capturados con línea de mano

  • names(df)[2:3]
  • df[,1]
  • c(dato_peces[[1,2]],

dato_peces[[1,3]], dato_peces[[2,2]], dato_peces[[2,3]], dato_peces[[3,2]], dato_peces[[3,3]])

¿Simple?

Especie

Presencia

Ausencia

pintadilla

1

4

tramboyo

3

2

lenguado

5

0

¿Cómo podrías acceder a los elementos

  • para obtener las categorías de ocurrencia?
  • para obtener la lista de especies?
  • para obtener todos los valores en un vector?

12 of 48

¿Alternativas?

13 of 48

¿Alternativas? Reestructurar la tabla

especie

presencia

ausencia

pintadilla

1

4

tramboyo

3

2

lenguado

5

0

especie

ocurrencia

n

pintadilla

presencia

1

tramboyo

presencia

3

lenguado

presencia

5

pintadilla

ausencia

4

tramboyo

ausencia

2

lenguado

ausencia

0

Formato ancho

Formato largo

  • names(df)[2:3]
  • df[,1]
  • c(df[[1,2]],df[[1,3]], df[[2,2]], df[[2,3]], df[[3,2]], df[[3,3]])
  • df$ocurrencia
  • df$especie
  • df$n

¿Cuál prefieres?

14 of 48

Por ejemplo, en la base de datos hydro

  • ¿Dónde deben añadirse las coordenadas por estación? ¿En una tabla adicional?
  • ¿Dónde debe añadirse la fecha? ¿Encima de los nombres de las estaciones?
  • ¿Qué hacer con los demás parámetros, salinidad y oxígeno? ¿Diferentes ficheros?
  • No está claro que los valores representan la temperatura.

presion

estacion_1

estacion_2

1

14.1

15.3

2

14.0

15.4

3

14.0

15.2

4

13.9

15.0

5

13.8

14.9

15 of 48

Solución: Reestructurar la tabla

presion

estacion_1

estacion_2

1

14.1

15.3

2

14.0

15.4

3

14.0

15.2

4

13.9

15.0

5

13.8

14.9

estacion

presion

temp

1

1

14.1

1

2

14

1

3

14

1

4

13.9

1

5

13.8

2

1

15.3

2

2

15.4

2

3

15.2

2

4

15.0

2

5

14.9

fecha

lat

long

Ahora puedes agregar más variables

Formato ancho

Formato largo

Esta tabla contiene los valores de temperatura por estación y presión

16 of 48

  • El formato “largo” considera:
    • Cada observación tiene su propia fila
    • Cada variable tiene su propia columna → Estación y temperatura no están mezclados

  • Sin embargo, algunas funciones requiere que los datos se encuentren en formato “wide” → Necesitarás ajustar tu tabla para esos casos.

17 of 48

¿Cómo cambiar el formato de tus datos?

18 of 48

tidyr provee dos funciones útiles para esos casos:

  • pivot_wider()
  • pivot_longer()

19 of 48

pivot_longer()

Mueve los nombres de las columnas a una columna clave, reuniendo los valores de las columnas en una única columna de valores.

especie

presencia

ausencia

pintadilla

1

4

tramboyo

3

2

lenguado

5

0

especie

ocurrencia

n

pintadilla

presencia

1

tramboyo

presencia

3

lenguado

presencia

5

pintadilla

ausencia

4

tramboyo

ausencia

2

lenguado

ausencia

0

pivot_longer(df, cols = x, names_to = “var1”, values_to = “var2”)

Tus datos

las variables que desea apilar

Encabezado de la nueva variable

20 of 48

pivot_wider()

Desplaza los valores únicos de una columna clave a los nombres de columna, repartiendo los valores de una columna de valor entre las nuevas columnas.

especie

ocurrencia

n

pintadilla

presencia

1

tramboyo

presencia

3

lenguado

presencia

5

pintadilla

ausencia

4

tramboyo

ausencia

2

lenguado

ausencia

0

pivot_wider(df, names_from = “ocurrencia”,, values_to = “n”)

las variables categóricas se vuelven en nuevas columnas

especie

ausencia

presencia

pintadilla

4

1

tramboyo

2

3

lenguado

0

5

Columnas alfabeticamente ordenadas

21 of 48

Ejemplo. En la consola de R escribe lo siguiente

22 of 48

Ejercicios

23 of 48

Ejercicio 1: Reestructura el dataframe

¿Por que pivot_longer() y pivot_wider() no son perfectamente simétricos? Considera el siguiente ejemplo

24 of 48

Ejercicio 1: Reestructura el dataframe

¿Por que pivot_longer() y pivot_wider() no son perfectamente simétricos? Considera el siguiente ejemplo

Ahora convertimos los datos a formato ancho y largo respectivamente:

¿Cual es la diferencia entre stock y stock_long?

25 of 48

Ejercicio 2: Reestructura el dataframe

Para qué sirve el argumento “names_to” de pivot_longer() :

  1. determina las columnas que se apilarán
  2. determina el nombre de la variable apilada
  3. determina si todos los factores del conjunto de datos deben coaccionarse a valores de caracteres

26 of 48

Ejercicio 2: Reestructura el dataframe

Para qué sirve el argumento “names_to” de pivot_longer() :

  • determina las columnas que se apilarán
  • determina el nombre de la variable apilada
  • determina si todos los factores del conjunto de datos deben coaccionarse a valores de caracteres

27 of 48

Separando y uniendo celdas

28 of 48

Usa las siguientes funciones para separar o combinar celdas: separate(), separate_row(), unite()

zona_est

temp

25_BY5

14.1

26_BMPJ2

14

26_J56

14

26_K32

13.9

27_B1

13.8

28_BY15

15.3

29_F64

15.4

30_SR5

15.2

30_US5B

15.0

zona

est

temp

25

BY5

14.1

26

BMPJ2

14

26

J56

14

26

K32

13.9

27

B1

13.8

28

BY15

15.3

29

F64

15.4

30

SR5

15.2

30

US5B

15.0

zona

est

temp

25

BY5

14.1

26

BMPJ2

14

26

J56

14

26

K32

13.9

27

B1

13.8

28

BY15

15.3

29

F64

15.4

30

SR5

15.2

30

US5B

15.0

zona_est

temp

25/BY5

14.1

26/BMPJ2

14

26/J56

14

26/K32

13.9

27/B1

13.8

28/BY15

15.3

29/F64

15.4

30/SR5

15.2

30/US5B

15.0

separate(df, zona_est, into = c(“zona”, “est”))

unite(df_split, zona, est, col = “zona_est”, sep = “/”))

separate()

unite()

29 of 48

Ejercicios

30 of 48

Ejercicio 3: Ejecute el siguiente código

31 of 48

Ejercicio 3: Ejecute el siguiente código

¿Qué hacen los argumentos extra y fill en separate()? Experimente con las distintas opciones para los dos conjuntos de datos siguientes.

32 of 48

Ejercicio 4: separate y unite

Tanto unite() como separate() tienen un argumento remove. ¿Para qué sirve?

  1. Remueve los valores adicionales
  2. Remueve los nombres de las columnas
  3. Remueve la columna original
  4. Remueve caracteres especiales en la columna

33 of 48

Ejercicio 4: separate y unite

Tanto unite() como separate() tienen un argumento remove. ¿Para qué sirve?

  • Remueve los valores adicionales
  • Remueve los nombres de las columnas
  • Remueve la columna original
  • Remueve caracteres especiales en la columna

34 of 48

Valores perdidos (NAs)

35 of 48

Valores NAs

  • Omitir los valores NAs pueden generar problemas.

¿Qué hacer?

  • Borrar filas/columnas. Siempre debe justificarse el motivo.
  • Interpolar los valores NAs
    • Reemplaza NAs por media/mediana (ventaja de la mediana: distribución puede ser sesgada)
    • Reemplaza NAs por regresión (interpolación linear)

36 of 48

Valores NAs

Puede aplicar la función is.na() a vectores individuales y variables individuales en un dataframe tal y como lo hicimos en las lecciones anteriores. Por ejemplo:

37 of 48

Recuerde que la función is.na() devuelve un vector lógico de la misma longitud que el vector original (¡que tiene, en nuestro caso, 30012 valores!).

Si usas la función sum() puedes calcular la suma de todos los valores TRUE, es decir, el total de valores NA de este vector:

Puedes hacer lo mismo para el dataframe completo

38 of 48

Una forma rápida de explorar la presencia de valores NA en una base de datos es utilizando la función summary(), que muestra no sólo el total de valores NA si no que también algunas estadísticas descriptivas.

39 of 48

Valores NAs

tidyr provee 3 funciones útiles para lidiar con valores NAs.

  1. drop_na(data, …): Retira todas las filas que contienen valores NAs
  2. fill(data, …, direction = c(“down”, “up”)): Completa valores NAs desde arriba o abajo (de acuerdo a la dirección indicada). Útil si sólo se registran los valores que cambian.
  3. replace_na(data, replace = list(), …): Reemplaza los valores NA con valores específicos para cada columna

est

pres

temp

1608

1

14.1

1608

2

NA

1608

3

13.8

1608

4

NA

1608

5

13.6

est

pres

temp

1608

1

14.1

1608

3

13.8

1608

5

13.6

est

pres

temp

1608

1

14.1

1608

2

14.1

1608

3

13.8

1608

4

13.8

1608

5

13.6

est

pres

temp

1608

1

14.1

1608

2

-999

1608

3

13.8

1608

4

-999

1608

5

13.6

drop_na(data = df, temp)

fill(data = df, temp)

replace_na(data = df, replace = list(temp = -999))

40 of 48

Valores NAs

Para reemplazar valores distintos a NAs, utiliza las reglas de indexación y los operadores de subconjunto que has aprendido hasta ahora:

  1. Reemplazar un valor individual, por ejemplo, establecer un valor extremo como NA para que quede excluido en el análisis:

  • Sustituir todos los valores negativos de temperatura por NA (pueden ser errores tipográficos o de medición).

41 of 48

Valores NAs

Para reemplazar valores distintos a NAs, utiliza las reglas de indexación y los operadores de subconjunto que has aprendido hasta ahora:

  • Reemplazar un valor individual, por ejemplo, establecer un valor extremo como NA para que quede excluido en el análisis:

  • Sustituir todos los valores negativos de temperatura por NA (pueden ser errores tipográficos o de medición).

42 of 48

Valores NAs

Una función útil para identificar la posición de los elementos de un vector para los que se cumplen las condiciones especificadas es which(). Identifiquemos el valor o los valores de temperatura que son iguales al valor máximo de temperatura observado y establezcamos este/estos como NA:

43 of 48

Ejercicios

44 of 48

Ejercicio 5: Valores NAs

  1. Elimine todas las filas que contienen NA en la variable “temp”
  2. Reemplazar los valores NAs con los valores previos
  3. Reemplazar los valores NAs con la media de la variable “temp”
  4. Reemplazar NAs con -999

¿Cuáles son las consecuencias si se hace esto?

45 of 48

Ejercicio 6: Valores NAs

Restaura el dataframe original (incluyendo los NAs en temp) y averigua cómo cambiar los NAs (con el valor anterior) en ambas variables 'temp' y 'sal' en un solo paso.

46 of 48

Ejercicio 7:

  1. Importe la base de datos “dummy_hydro.csv”
  2. Para reestructurar la base de datos en un formato tidy ¿que debe considerar?
    1. ¿Es necesaria alguna reestructuración?
    2. ¿Es necesaria alguna separación o unión?
    3. ¿Está de acuerdo con los nombres de las columnas?
    4. ¿Son correctos los tipos de datos?
    5. ¿Necesitas manejar NAs?
    6. ¿Hay valores extraños en los datos (posibles errores tipográficos)?

47 of 48

Ejercicio 5 (SOLUCIÓN)

48 of 48

Ejercicio 6 (SOLUCIÓN)

Restaura el dataframe original (incluyendo los NAs en temp) y averigua cómo cambiar los NAs (con el valor anterior) en ambas variables 'temp' y 'sal' en un solo paso.