General

Top 10: Manipulación de datos con dplyr

¿Quieres aprender a simplificar las 10 operaciones más frecuentes que realizas con tus datos? Te enseñaré trucos para manipular, limpiar y resumir datos con rapidez y efectividad. Conoce las mejores herramientas que el paquete dplyr de R te puede ofrecer.

Publicado10 de junio de 2022
Lectura8 min
Top 10: Manipulación de datos con dplyr

¿Quieres aprender a simplificar las 10 operaciones más frecuentes que realizas con tus datos? Te enseñaré trucos para manipular, limpiar y resumir datos con rapidez y efectividad. Conoce las mejores herramientas que el paquete dplyr de R te puede ofrecer.

En el post anterior te enseñé qué es el paquete dplyr y para qué aplicaciones puedes utilizarlo. Hoy veremos mis 10 tareas de manipulación favoritas con dplyr.

Contenidos

Aplicación con datos de flores de lirios (iris)

Utilizaremos como ejemplo los datos iris que vienen precargados en R sobre el largo y ancho de sépalos y pétalos en 3 especies de flores de lirios.

text
> data(iris)
text
> head(iris)
Imagen

1. Resume múltiples columnas

¿Cuál es la media del largo y ancho de sépalos y pétalos para cada especie?

text
> iris %>% 
group_by(Species) %>% 
summarise_all(mean)
# A tibble: 3 x 5
  Species    Sepal.Length Sepal.Width Petal.Length Petal.Width
  <fct>             <dbl>       <dbl>        <dbl>       <dbl>
1 setosa             5.01        3.43         1.46       0.246
2 versicolor         5.94        2.77         4.26       1.33 
3 virginica          6.59        2.97         5.55       2.03

Si deseas resumir solo ciertas columnas, utiliza las funciones summarise_at o summarise_if.

2. Selecciona filas con los valores máximos en cada grupo

Imagina que solo quieres obtener aquel caso con mayor valor de largo de sépalos, para cada especie.

text
> iris %>% 
+   group_by(Species) %>%
+   filter(Sepal.Length == max(Sepal.Length)) %>%
+   arrange(Species)
# A tibble: 3 x 5
# Groups:   Species [3]
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species   
         <dbl>       <dbl>        <dbl>       <dbl> <fct>     
1          5.8         4            1.2         0.2 setosa    
2          7           3.2          4.7         1.4 versicolor
3          7.9         3.8          6.4         2   virginica

De manera equivalente, puedes utilizar:

text
> iris %>% 
+     group_by(Species) %>% 
+     slice(which.max(Sepal.Length))
# A tibble: 3 × 5
# Groups:   Species [3]
  
Sepal.Length Sepal.Width Petal.Length Petal.Width Species   
         
<dbl>       <dbl>        <dbl>       <dbl> <fct>     
1          5.8         4            1.2         0.2 setosa    

2          7           3.2          4.7         1.4 versicolor
3          7.9         3.8          6.4         2   virginica 

3. Aplica una función a cada fila de una tabla

Y si quieres calcular una nueva variable (columna) con el valor máximo del largo de sépalos o pétalos, hacemos lo siguiente:

text
> iris %>% 
+   rowwise() %>% 
+   mutate(Max.Len= max(Sepal.Length,Petal.Length))
Source: local data frame [150 x 6]
Groups: <by row>
# A tibble: 150 x 6
   Sepal.Length Sepal.Width Petal.Length Petal.Width Species Max.Len
          <dbl>       <dbl>        <dbl>       <dbl> <fct>     <dbl>
 1          5.1         3.5          1.4         0.2 setosa      5.1
 2          4.9         3            1.4         0.2 setosa      4.9
 3          4.7         3.2          1.3         0.2 setosa      4.7
 4          4.6         3.1          1.5         0.2 setosa      4.6
# … with 140 more rows

4. Obtén las frecuencias relativas o proporciones

¿Qué % de casos tenemos por especie?

text
> iris %>% 
+ group_by(Species) %>% 
+ summarise(n = n()) %>% 
+ mutate(freq = n / sum(n))
# A tibble: 3 × 3
Species n freq
1 setosa 50 0.333
2 versicolor 50 0.333
3 virginica 50 0.333

En este caso tenemos 50 flores (casos o filas) para cada especie, por lo tanto hay un 33% de la muestra que corresponde a la especie de lirio setosa, 33% a veriscolor y 33% a virginica.

5. Elimina filas duplicadas

Esta es una tarea habitual en la manipulación de datos, pero es fácil de solucionar con la función distinct():

text
> iris %>% 
distinct(Species)
    Species
1  setosa
2  versicolor
3  virginica

Nos muestra que la variable "Species" solo tiene 3 etiquetas distintas: setosa, virginica y vericolor

6. Cambia el nombre de las variables

A menudo necesitamos acortar los nombres de las variables (columnas), para escribir código de manera más sencilla y rápida. Por ejemplo, aquí llamaremos "SL" a la variable "Sepal.Length" para evitar errores de escritura con las mayúsculas, puntos y el inglés. Para renombrar las columnas podemos escribir lo siguiente:

text
> iris %>% 
rename(SL = Sepal.Length) %>% 
head()
   SL Sepal.Width Petal.Length Petal.Width Species
1 5.1         3.5          1.4         0.2  setosa
2 4.9         3.0          1.4         0.2  setosa
3 4.7         3.2          1.3         0.2  setosa
4 4.6         3.1          1.5         0.2  setosa
5 5.0         3.6          1.4         0.2  setosa
6 5.4         3.9          1.7         0.4  setosa

Vemos que solo ha cambiado el nombre de la columna seleccionada.

7. Selecciona casos completos

¿Cómo quedarnos con las observaciones completas? Construimos un conjunto de datos ficticio que contenga valores perdidos (o faltantes, NA) para el ejemplo:

text
> df <- tibble(x = c(1, 2, NA), y = c("a", NA, "b"))
> df
# A tibble: 3 x 2
      x y    
  <dbl> <chr>
1     1 a    
2     2 NA   
3    NA b

Si queremos descartar todos los casos que contengan NA, escribimos:

text
> df %>% drop_na()
# A tibble: 1 x 2
      x y    
  <dbl> <chr>
1     1 a    

Si queremos descartar casos en función de una variable:

text
> df %>% drop_na(x)
# A tibble: 2 x 2
      x y    
  <dbl> <chr>
1     1 a    
2     2 NA   

También puedes utilizar las funciones na.omit(),  filter(complete.cases(.)) o filter(!is.na(x1)).

8. Suma a través de múltiples filas/columnas

Creamos un conjunto de datos de ejemplo, imagina que 1 es presencia y 0 ausencia (o Sí/NO).

text
> df=data.frame(
   x1=c(1,0,0,NA,0,1,1,NA,0,1),
   x2=c(1,1,NA,1,1,0,NA,NA,0,1),
   x3=c(0,1,0,1,1,0,NA,NA,0,1))
> df
   x1 x2 x3
1   1  1  0
2   0  1  1
3   0 NA  0
4  NA  1  1
5   0  1  1
6   1  0  0
7   1 NA NA
8  NA NA NA
9   0  0  0
10  1  1  1

Para realizar la suma, imagina que podemos reemplazar los NA por cero (ausencia de información y ausencia del evento). Para resumir todas las columnas usamos summarise_all:

text
> df %>%
    replace(is.na(.), 0) %>%
    summarise_all(funs(sum))
 x1 x2 x3
1  4  5  4

Para resumir cada fila:

text
> df %>%
    replace(is.na(.), 0) %>%
    mutate(sum = rowSums(.[1:3]))
  x1 x2 x3 sum
1   1  1  0   2
2   0  1  1   2
3   0  0  0   0
4   0  1  1   2
5   0  1  1   2
6   1  0  0   1
7   1  0  0   1
8   0  0  0   0
9   0  0  0   0
10  1  1  1   3

9. Cuenta el número de casos o filas

Esto es muy importante, porque cuando resumimos los datos en estadísticos descriptivos deberíamos tener en cuenta el número de observaciones que se ha utilizado para ello:

text
> iris %>% 
group_by(Species) %>% 
summarise(n = n(), meanSL = mean(Sepal.Length))
# A tibble: 3 × 3
  
Species        n meanSL
  
<fct>      <int>  <dbl>
1 setosa        50   5.01

2 versicolor    50   5.94

3 virginica     50   6.59

También puedes utilizar la función count:

text
> iris %>% 
group_by(Species) %>% 
count()
A tibble: 3 × 2
Groups: Species [3]
Species n
1 setosa 50
2 versicolor 50
3 virginica 50

10. Cuenta el número de casos o filas únicas (con NAs)

Cuando tenemos un conjunto de datos con NAs podemos contar el número de casos o filas únicas con la función n_distinct().

Creamos un conjunto de datos ficticio para el ejemplo.

text
> data=data.frame(aa=c(1,2,3,4,NA), bb=c('a', 'b', 'a', 'c', 'c')) 
> data
 aa bb
1  1  a
2  2  b
3  3  a
4  4  c
5 NA  c

> data %>%                    
+   filter(!is.na(aa)) %>%    
+   group_by(bb) %>%          
+   summarise(Unique_Elements = n_distinct(aa))   
# A tibble: 3 x 2
  bb    Unique_Elements
  <fct>           <int>
1 a                   2
2 b                   1
3 c                   1

Por ejemplo, aquí hemos seleccionado los casos que no tienen NA en la variable "aa" y contado los casos distintos para la variable "bb".

Si quieres aprender mucho más sobre R y dplyr, ¡apúntate al curso de Introducción a Data Science y domina R y R Studio!

Sigue leyendo

Artículos relacionados

¿Qué es la multicolinealidad y por qué es un problema?
General

¿Qué es la multicolinealidad y por qué es un problema?

Deseamos interpretar los modelos para comprender sus predicciones, sin embargo, a veces no recordamos que esta interpretación puede verse afectada por al incumplir los supuestos del modelo. La multicolinealidad es uno de estos casos, y p…

Leer más
Aprende Caret y simplifica la creación de modelos predictivos en Machine Learning
General

Aprende Caret y simplifica la creación de modelos predictivos en Machine Learning

Crea más de 200 modelos con la misma sintaxis y resuelve problemas de clasificación y regresión con Machine Learning ¿Por qué debemos utilizar la librería Caret en R? En el mundo de la ciencia de datos existen múltiples algoritmos para e…

Leer más
3 tendencias en inteligencia artificial y aprendizaje automático para 2022
General

3 tendencias en inteligencia artificial y aprendizaje automático para 2022

En el 2021 las noticias sobre&nbsp; inteligencia artificial &nbsp;(IA) y aprendizaje automático ( Machine Learning o ML) se han disparado y se prevé que aceleren en el 2022. Muchos afirman que estas tecnologías serán las más disruptivas …

Leer más