Chapter 12 DATA FRAME: CREACIÓN, SELECCIÓN, FILTROS, AGREGACIÓN Y TRANSFORMACIÓN DE DATOS.

En este capítulo se tratará sobre la creación de uno de los objetos más importantes en R, los data frames. Asimismo, se mostrará cómo crearlos a través de vectores, cómo seleccionar entre columnas, cómo filtrar entre filas, agregar columnas y filas al data frame; y por último, transformar datos con R base. Esto nos servirá como introducción fundamental para el siguiente capítulo en donde se trabajará con distintos tipos de archivos como: xlsx, xls, sav, dta, txt, csv, entre otros.

12.1 Creación de data frames.

Un data frame es un objeto que compila uno o más vectores con el fin de tener una estructura compacta y ordenada. En palabras sencillas, será tu tabla de datos en donde tendrás agrupado tus variables que te permitirán desarrollar modelos, gráficos, etc.

La sintaxis del data frame es la siguiente:

data.frame(..., row.names = NULL, stringsAsFactors = FALSE, ...)

Donde:

... = En este argumento se asignarán las columnas o variables que tendrá el data frame.
row.names = Este argumento permite asignar los nombres de las filas, por defecto es NULL lo cual implica que las filas no tendrán nombres, sino una numeración consecutiva.
stringsAsFactors = Argumento lógico que si toma el valor de TRUE convertirá en factores a las variables que son caracter. Su valor por defecto es FALSE, por lo que las variables caracter seguirán siendo caracter.
... = Los tres puntos al final de la función nos permite asignar otros argumentos que puede encontrar en la documentación ?data.frame.

Como primer ejemplo vamos a crear un data frame de 4 columnas.

# Crear un data frame.
set.seed(2021)
df<-data.frame(edad=sample(10:30, 10, T), 
               sexo=sample(c("Masculino","Femenino"), 10, T),
               ingresos=sample(1000:5000, 10, T),
               raza=sample(c("blanco","negro"), 10, T))

Y veamos como queda un data frame.

# Viendo el data frame.
df
##    edad      sexo ingresos   raza
## 1    16 Masculino     2211  negro
## 2    15 Masculino     1636  negro
## 3    23 Masculino     3434 blanco
## 4    16 Masculino     4885  negro
## 5    21 Masculino     1359 blanco
## 6    29  Femenino     1537  negro
## 7    15 Masculino     1163 blanco
## 8    15  Femenino     3148 blanco
## 9    15  Femenino     1341 blanco
## 10   23 Masculino     1670  negro

El resultado que obtenemos es un data frame de 4 columnas y 10 filas. Pero ¿Cómo se hizo? Primero, hemos asignado una semilla set.seed(2021) porque vamos a crear vectores con elementos aleatorios. Luego, creamos el objeto df que tiene 4 columnas: edad, sexo, ingresos y raza todos tienen elementos aleatorios.

Es importante darse cuenta que para asignar objetos usamos <- pero para asignar columnas dentro de la función data.frame() estamos usando =. Aquí un ejemplo de cuando usar <- y cuando =.

Si usted desea ver los resultados en una pestaña y no en la consola, entonces, usted corre:

# Para ver el data frame en una pestaña.
View(df)
Vista del data frame

Para ver la estructura de las columnas o variables, se usa la función str().

str(df)
## 'data.frame':    10 obs. of  4 variables:
##  $ edad    : int  16 15 23 16 21 29 15 15 15 23
##  $ sexo    : chr  "Masculino" "Masculino" "Masculino" "Masculino" ...
##  $ ingresos: int  2211 1636 3434 4885 1359 1537 1163 3148 1341 1670
##  $ raza    : chr  "negro" "negro" "blanco" "negro" ...

Nos dice que las variables edad e ingresos son variables de tipo entero y las variables sexo y raza son variables de tipo caracter. Recuerde que el valor por defecto de stringsAsFactors es FALSE, por lo que las variables caracater se mantienen como caracter, si cambiamos el valor del argumento por TRUE entonces las variables caracter se convertirían en factor.

Ahora vamos a crear un data frame similar que nos servirá como ejemplo para los siguientes ejemplos.

set.seed(2021)
df<-data.frame(edad=sample(10:30, 30, T), 
               sexo=sample(c("Masculino","Femenino"), 30, T),
               ingresos=sample(1000:5000, 30, T),
               raza=sample(c("blanco","negro"), 30, T),
               material_casa=sample(c("noble","rustica"), 30, T),
               experiencia=sample(0:15,30,T),
               num_hijos=sample(0:4, 30, T))

Viendo el data frame que hemos creado.

df
##    edad      sexo ingresos   raza material_casa experiencia num_hijos
## 1    16  Femenino     1680  negro         noble          15         1
## 2    15 Masculino     2144 blanco         noble           6         4
## 3    23 Masculino     2822  negro       rustica          10         4
## 4    16  Femenino     3558 blanco       rustica          12         4
## 5    21  Femenino     1368 blanco         noble           0         2
## 6    29  Femenino     4784  negro         noble           2         4
## 7    15  Femenino     4036 blanco         noble           3         4
## 8    15 Masculino     3202 blanco         noble           0         4
## 9    15 Masculino     2527 blanco         noble          12         4
## 10   23  Femenino     3442 blanco       rustica           5         3
## 11   14 Masculino     4440 blanco         noble          13         4
## 12   24  Femenino     2955 blanco         noble           4         2
## 13   16 Masculino     3981 blanco         noble          13         4
## 14   18  Femenino     1621 blanco       rustica           6         4
## 15   21  Femenino     4197 blanco       rustica          15         2
## 16   28 Masculino     2486  negro         noble          13         2
## 17   27 Masculino     2745  negro         noble          12         0
## 18   12  Femenino     4656  negro       rustica           4         4
## 19   23 Masculino     4602  negro       rustica          15         2
## 20   17  Femenino     2551  negro         noble           9         0
## 21   13 Masculino     4051 blanco         noble          10         3
## 22   14  Femenino     2505 blanco         noble           4         2
## 23   25  Femenino     4940 blanco         noble           5         4
## 24   11  Femenino     3686 blanco       rustica          13         3
## 25   28  Femenino     1361 blanco       rustica           7         4
## 26   13 Masculino     1509 blanco         noble           1         4
## 27   30 Masculino     4829  negro         noble           2         0
## 28   14  Femenino     3347  negro         noble           2         4
## 29   18 Masculino     1789 blanco         noble           6         1
## 30   15  Femenino     1549 blanco         noble           0         2

En este caso nuestro data frame tiene 7 columnas y 30 filas. Imagínese un data frame con más filas y con más columnas, al querer verlo se mostrará una gran cantidad de datos, lo que no es recomendable, solo nos bastaría con ver un pequeño subconjunto del data frame. Entonces si queremos ver las primeras 6 filas de un data frame, se usará la función head().

# Viendo las 6 primeras filas. 
head(df)
##   edad      sexo ingresos   raza material_casa experiencia num_hijos
## 1   16  Femenino     1680  negro         noble          15         1
## 2   15 Masculino     2144 blanco         noble           6         4
## 3   23 Masculino     2822  negro       rustica          10         4
## 4   16  Femenino     3558 blanco       rustica          12         4
## 5   21  Femenino     1368 blanco         noble           0         2
## 6   29  Femenino     4784  negro         noble           2         4

Pero quizá desee ver una cantidad mayor o menor de filas. Para esto se usa la misma función pero especificando el número de filas en el argumento n de la función head().

# Viendo las 3 primeras filas.
head(df, n=3)
##   edad      sexo ingresos   raza material_casa experiencia num_hijos
## 1   16  Femenino     1680  negro         noble          15         1
## 2   15 Masculino     2144 blanco         noble           6         4
## 3   23 Masculino     2822  negro       rustica          10         4
# Viendo las 10 primeras filas.
head(df, n=10)
##    edad      sexo ingresos   raza material_casa experiencia num_hijos
## 1    16  Femenino     1680  negro         noble          15         1
## 2    15 Masculino     2144 blanco         noble           6         4
## 3    23 Masculino     2822  negro       rustica          10         4
## 4    16  Femenino     3558 blanco       rustica          12         4
## 5    21  Femenino     1368 blanco         noble           0         2
## 6    29  Femenino     4784  negro         noble           2         4
## 7    15  Femenino     4036 blanco         noble           3         4
## 8    15 Masculino     3202 blanco         noble           0         4
## 9    15 Masculino     2527 blanco         noble          12         4
## 10   23  Femenino     3442 blanco       rustica           5         3

Quizá usted desee ver las 6 últimas filas, entonces, se usará la función tail().

# Viendo las últimas 6 filas.
tail(df)
##    edad      sexo ingresos   raza material_casa experiencia num_hijos
## 25   28  Femenino     1361 blanco       rustica           7         4
## 26   13 Masculino     1509 blanco         noble           1         4
## 27   30 Masculino     4829  negro         noble           2         0
## 28   14  Femenino     3347  negro         noble           2         4
## 29   18 Masculino     1789 blanco         noble           6         1
## 30   15  Femenino     1549 blanco         noble           0         2

Esta función es similar a head() así que también acepta el argumento n pero ahora mostrará las últimas columnas.

Si usted desea ver los nombres de las columnas, entonces, tiene que usar la función names().

names(df)
## [1] "edad"          "sexo"          "ingresos"      "raza"         
## [5] "material_casa" "experiencia"   "num_hijos"

Esta función también nos sirve para poder cambiar los nombres de las columnas o variables. Por ejemplo, vamos a cambiar el nombre de la variable sexo por genero.

names(df)[2]<-"genero"

Usamos names(df) para llamar a los nombres y luego colocamos el [2] porque con aquello llamamos al elemento 2 del vector de nombres, el elemento 2 es sexo, entonces, ahora le asignamos el valor de genero.

Veamos ahora como ha quedado con el cambio de nombre.

names(df)
## [1] "edad"          "genero"        "ingresos"      "raza"         
## [5] "material_casa" "experiencia"   "num_hijos"

Y en efecto, ahora la segunda variable que se llamaba sexo ahora se llama genero. Usted puede cambiar uno o más o todos los nombres de las variables. Veamos un ejemplo adicional para que usted pueda generalizar este conocimiento.

names(df)[c(1:2,6)]<-c("EDAD","GENERO","EXPERIENCIA")

Lo que hemos hecho es cambiar el nombre de las variables de posición 1, 2 y 6.

names(df)
## [1] "EDAD"          "GENERO"        "ingresos"      "raza"         
## [5] "material_casa" "EXPERIENCIA"   "num_hijos"

Ahora, si queremos saber la dimensión de nuestro data frame, es decir, el número de filas y columnas. Para obtener esta información se usa la función dim().

# Para saber el número de filas y columnas del data frame.
dim(df)
## [1] 30  7

El resultado de posición 1 es el número de filas y el resultado de posición 2 es el número de columnas. Entonces, si deseamos saber solo el número de filas o solo el número de columnas escribiremos.

# Para saber el número de filas.
dim(df)[1]
## [1] 30
# Para saber el número de columnas. 
dim(df)[2]
## [1] 7

12.2 Selección de columnas.

Para seleccionar columnas o variables vamos a usar R base y el paquete dplyr19, por cada uno veremos distintas maneras.

12.2.1 R base - por índice.

La sintaxis es similar a la que se usó para seleccionar columnas de las matrices. Recordar que una matriz tiene la siguiente estructura: matriz[i,j]. Donde la i hace referencia a las filas y la j hace referencia a las columnas. Lo mismo es para los data frames.

Entonces, si deseamos seleccionar la segunda columna del data frame, entonces la sintaxis sería la siguiente:

# Seleccionando la segunda columna.
df[,2] 
##  [1] "Femenino"  "Masculino" "Masculino" "Femenino"  "Femenino"  "Femenino" 
##  [7] "Femenino"  "Masculino" "Masculino" "Femenino"  "Masculino" "Femenino" 
## [13] "Masculino" "Femenino"  "Femenino"  "Masculino" "Masculino" "Femenino" 
## [19] "Masculino" "Femenino"  "Masculino" "Femenino"  "Femenino"  "Femenino" 
## [25] "Femenino"  "Masculino" "Masculino" "Femenino"  "Masculino" "Femenino"

Para seleccionar la columna 1, 3 y 6.

df[,c(1,3,6)] # Selección de las columnas 1, 3 y 6.
##    EDAD ingresos EXPERIENCIA
## 1    16     1680          15
## 2    15     2144           6
## 3    23     2822          10
## 4    16     3558          12
## 5    21     1368           0
## 6    29     4784           2
## 7    15     4036           3
## 8    15     3202           0
## 9    15     2527          12
## 10   23     3442           5
## 11   14     4440          13
## 12   24     2955           4
## 13   16     3981          13
## 14   18     1621           6
## 15   21     4197          15
## 16   28     2486          13
## 17   27     2745          12
## 18   12     4656           4
## 19   23     4602          15
## 20   17     2551           9
## 21   13     4051          10
## 22   14     2505           4
## 23   25     4940           5
## 24   11     3686          13
## 25   28     1361           7
## 26   13     1509           1
## 27   30     4829           2
## 28   14     3347           2
## 29   18     1789           6
## 30   15     1549           0

12.2.2 R base - por el nombre de la variable.

Se usará la misma sintaxis que anteriormente, pero en vez de índices se colocará los nombres de las columnas.

Por ejemplo, si se quiere seleccionar la segunda columna.

# Seleccionado la segunda columna.
df[,"GENERO"]
##  [1] "Femenino"  "Masculino" "Masculino" "Femenino"  "Femenino"  "Femenino" 
##  [7] "Femenino"  "Masculino" "Masculino" "Femenino"  "Masculino" "Femenino" 
## [13] "Masculino" "Femenino"  "Femenino"  "Masculino" "Masculino" "Femenino" 
## [19] "Masculino" "Femenino"  "Masculino" "Femenino"  "Femenino"  "Femenino" 
## [25] "Femenino"  "Masculino" "Masculino" "Femenino"  "Masculino" "Femenino"

Para seleccionar las columnas 3 y 4.

# Seleccionado la columna 3 y 4.
df[,c("ingresos","raza")]
##    ingresos   raza
## 1      1680  negro
## 2      2144 blanco
## 3      2822  negro
## 4      3558 blanco
## 5      1368 blanco
## 6      4784  negro
## 7      4036 blanco
## 8      3202 blanco
## 9      2527 blanco
## 10     3442 blanco
## 11     4440 blanco
## 12     2955 blanco
## 13     3981 blanco
## 14     1621 blanco
## 15     4197 blanco
## 16     2486  negro
## 17     2745  negro
## 18     4656  negro
## 19     4602  negro
## 20     2551  negro
## 21     4051 blanco
## 22     2505 blanco
## 23     4940 blanco
## 24     3686 blanco
## 25     1361 blanco
## 26     1509 blanco
## 27     4829  negro
## 28     3347  negro
## 29     1789 blanco
## 30     1549 blanco

12.2.3 R base - usando expresiones regulares.

Podemos usar expresiones regulares, pero aún veremos ese tema en capítulos posteriores. Por el momento solo dejaremos la sintaxis y después de revisar el tema de expresiones regulares usted podrá entender al 100% la sintaxis.

Por ejemplo, vamos a seleccionar las columnas que terminan en “a” o en “O”.

# Seleccioando las columnas que terminan en "a" o en "o".
df[,grepl("a$|O$",names(df))]
##       GENERO   raza material_casa
## 1   Femenino  negro         noble
## 2  Masculino blanco         noble
## 3  Masculino  negro       rustica
## 4   Femenino blanco       rustica
## 5   Femenino blanco         noble
## 6   Femenino  negro         noble
## 7   Femenino blanco         noble
## 8  Masculino blanco         noble
## 9  Masculino blanco         noble
## 10  Femenino blanco       rustica
## 11 Masculino blanco         noble
## 12  Femenino blanco         noble
## 13 Masculino blanco         noble
## 14  Femenino blanco       rustica
## 15  Femenino blanco       rustica
## 16 Masculino  negro         noble
## 17 Masculino  negro         noble
## 18  Femenino  negro       rustica
## 19 Masculino  negro       rustica
## 20  Femenino  negro         noble
## 21 Masculino blanco         noble
## 22  Femenino blanco         noble
## 23  Femenino blanco         noble
## 24  Femenino blanco       rustica
## 25  Femenino blanco       rustica
## 26 Masculino blanco         noble
## 27 Masculino  negro         noble
## 28  Femenino  negro         noble
## 29 Masculino blanco         noble
## 30  Femenino blanco         noble

12.2.4 Dplyr - Usando la función select.

Para usar el paquete dplyr primero tenemos que instalar el paquete y luego cargarlo. Para instalar el paquete usamos la siguiente sintaxis.

# Instalando el paquete.
install.packages("dplyr")

Y para cargar el paquete.

library(dplyr)

Una vez hecho estos pasos podemos usar las funciones de este paquete y poder seleccionar columnas con la función select().

Por ejemplo, vamos a seleccionar la columna num_hijos.

# Seleccionando la columna num_hijos.
df %>% select("num_hijos")
##    num_hijos
## 1          1
## 2          4
## 3          4
## 4          4
## 5          2
## 6          4
## 7          4
## 8          4
## 9          4
## 10         3
## 11         4
## 12         2
## 13         4
## 14         4
## 15         2
## 16         2
## 17         0
## 18         4
## 19         2
## 20         0
## 21         3
## 22         2
## 23         4
## 24         3
## 25         4
## 26         4
## 27         0
## 28         4
## 29         1
## 30         2

Para seleccionar las columnas material_casa y EXPERIENCIA.

# Seleccionando las columnas material_casa y EXPERIENCIA.
df %>% select("material_casa","EXPERIENCIA")
##    material_casa EXPERIENCIA
## 1          noble          15
## 2          noble           6
## 3        rustica          10
## 4        rustica          12
## 5          noble           0
## 6          noble           2
## 7          noble           3
## 8          noble           0
## 9          noble          12
## 10       rustica           5
## 11         noble          13
## 12         noble           4
## 13         noble          13
## 14       rustica           6
## 15       rustica          15
## 16         noble          13
## 17         noble          12
## 18       rustica           4
## 19       rustica          15
## 20         noble           9
## 21         noble          10
## 22         noble           4
## 23         noble           5
## 24       rustica          13
## 25       rustica           7
## 26         noble           1
## 27         noble           2
## 28         noble           2
## 29         noble           6
## 30         noble           0

En los dos ejemplos se ha usado el operador %>%, este operador es llamado pipe, que juega el rol de enlace entre sintaxis. Por ejemplo, en el primer ejemplo está enlazando df con select("num_hijos"), es decir, lo que se le está indicando al software es vas a seleccionar la variable num_hijos del data frame df.

Para que usted se de cuenta, la sintaxis sin el uso del pipe sería el siguiente.

# Seleccionando la columna num_hijos.
select(df, "num_hijos")
##    num_hijos
## 1          1
## 2          4
## 3          4
## 4          4
## 5          2
## 6          4
## 7          4
## 8          4
## 9          4
## 10         3
## 11         4
## 12         2
## 13         4
## 14         4
## 15         2
## 16         2
## 17         0
## 18         4
## 19         2
## 20         0
## 21         3
## 22         2
## 23         4
## 24         3
## 25         4
## 26         4
## 27         0
## 28         4
## 29         1
## 30         2

El pipe sirve mucho para sintaxis largas ya que el código se va acortando gracias a este operador. En capítulos posteriores verá más a detalle su potencial.

Ahora, la función select() también acepta otras funciones como argumentos que lo hacen más versátil. Por ejemplo, podemos usar las funciones starts_with() o ends_with() o contains() o matches().

Veamos ejemplos de cada uno a continuación.

Si deseamos seleccionar columnas que empiezan con un determinado caracter o caracteres tendremos que usar la función starts_with(). Por ejemplo, queremos seleccionar las columnas que empiezan con la letra “E”.

# Seleccionando las columnas que empiezan con la letra "E".
df %>% select(starts_with("E"))
##    EDAD EXPERIENCIA
## 1    16          15
## 2    15           6
## 3    23          10
## 4    16          12
## 5    21           0
## 6    29           2
## 7    15           3
## 8    15           0
## 9    15          12
## 10   23           5
## 11   14          13
## 12   24           4
## 13   16          13
## 14   18           6
## 15   21          15
## 16   28          13
## 17   27          12
## 18   12           4
## 19   23          15
## 20   17           9
## 21   13          10
## 22   14           4
## 23   25           5
## 24   11          13
## 25   28           7
## 26   13           1
## 27   30           2
## 28   14           2
## 29   18           6
## 30   15           0

Y en efecto se han seleccionado las columnas EDAD y EXPERIENCIA, porque las dos variables empiezan con la letra “E”.

Ahora si se desea seleccionar las columnas que terminan en uno o más caracteres entonces, tendremos que usar la función ends_with(). Por ejemplo, vamos a seleccionar las columnas que terminan en “a”.

# Seleccionando las columnas que terminan en "a".
df %>% select(ends_with("a"))
##      raza material_casa EXPERIENCIA
## 1   negro         noble          15
## 2  blanco         noble           6
## 3   negro       rustica          10
## 4  blanco       rustica          12
## 5  blanco         noble           0
## 6   negro         noble           2
## 7  blanco         noble           3
## 8  blanco         noble           0
## 9  blanco         noble          12
## 10 blanco       rustica           5
## 11 blanco         noble          13
## 12 blanco         noble           4
## 13 blanco         noble          13
## 14 blanco       rustica           6
## 15 blanco       rustica          15
## 16  negro         noble          13
## 17  negro         noble          12
## 18  negro       rustica           4
## 19  negro       rustica          15
## 20  negro         noble           9
## 21 blanco         noble          10
## 22 blanco         noble           4
## 23 blanco         noble           5
## 24 blanco       rustica          13
## 25 blanco       rustica           7
## 26 blanco         noble           1
## 27  negro         noble           2
## 28  negro         noble           2
## 29 blanco         noble           6
## 30 blanco         noble           0

Y nos selecciona las columnas material_casa, raza y EXPERIENCIA, ya que estas variables terminan en “a”.

Si deseamos seleccionar columnas que contengan uno o más caracteres, se usará la función contains(). Por ejemplo queremos seleccionar las columnas que contengan los caracteres “er”.

# Seleccionando las columnas que contengan "er".
df %>% select(contains("er"))
##       GENERO material_casa EXPERIENCIA
## 1   Femenino         noble          15
## 2  Masculino         noble           6
## 3  Masculino       rustica          10
## 4   Femenino       rustica          12
## 5   Femenino         noble           0
## 6   Femenino         noble           2
## 7   Femenino         noble           3
## 8  Masculino         noble           0
## 9  Masculino         noble          12
## 10  Femenino       rustica           5
## 11 Masculino         noble          13
## 12  Femenino         noble           4
## 13 Masculino         noble          13
## 14  Femenino       rustica           6
## 15  Femenino       rustica          15
## 16 Masculino         noble          13
## 17 Masculino         noble          12
## 18  Femenino       rustica           4
## 19 Masculino       rustica          15
## 20  Femenino         noble           9
## 21 Masculino         noble          10
## 22  Femenino         noble           4
## 23  Femenino         noble           5
## 24  Femenino       rustica          13
## 25  Femenino       rustica           7
## 26 Masculino         noble           1
## 27 Masculino         noble           2
## 28  Femenino         noble           2
## 29 Masculino         noble           6
## 30  Femenino         noble           0

Y en efecto, nos selecciona las columnas GENERO, material_casa y EXPERIENCIA.

Por último, la función matches() sirve para seleccionar columnas usando expresiones regulares. Usaremos la misma expresión regular que en el ejemplo de R base, con lo cual seleccionaremos las columnas que terminan en “a” o en “O”.

# Seleccionando las columnas que terminan en "a" o en "O".
df %>% select(matches("a$|O$"))
##       GENERO   raza material_casa EXPERIENCIA
## 1   Femenino  negro         noble          15
## 2  Masculino blanco         noble           6
## 3  Masculino  negro       rustica          10
## 4   Femenino blanco       rustica          12
## 5   Femenino blanco         noble           0
## 6   Femenino  negro         noble           2
## 7   Femenino blanco         noble           3
## 8  Masculino blanco         noble           0
## 9  Masculino blanco         noble          12
## 10  Femenino blanco       rustica           5
## 11 Masculino blanco         noble          13
## 12  Femenino blanco         noble           4
## 13 Masculino blanco         noble          13
## 14  Femenino blanco       rustica           6
## 15  Femenino blanco       rustica          15
## 16 Masculino  negro         noble          13
## 17 Masculino  negro         noble          12
## 18  Femenino  negro       rustica           4
## 19 Masculino  negro       rustica          15
## 20  Femenino  negro         noble           9
## 21 Masculino blanco         noble          10
## 22  Femenino blanco         noble           4
## 23  Femenino blanco         noble           5
## 24  Femenino blanco       rustica          13
## 25  Femenino blanco       rustica           7
## 26 Masculino blanco         noble           1
## 27 Masculino  negro         noble           2
## 28  Femenino  negro         noble           2
## 29 Masculino blanco         noble           6
## 30  Femenino blanco         noble           0

Y en efecto, selecciona las columnas GENERO, raza, material_casa y EXPERIENCIA. Para el caso de la función select las mayúsculas y minúsculas no se diferencian a menos que se cambie uno de los argumentos el cual es ignore.case. Pero esto ya se verá en el tema de expresiones regulares.

12.3 Filtro de filas.

Al igual que anteriormente, el filtro de filas puede hacerse por medio de R base o usando el paquete dplyr20.

12.3.1 Usando R base.

En R base, si deseamos llamar a una columna en específico, entonces usaremos el operador $21, es así que para llamar a una columna primero se llamará al data frame y con el $ se llamará a la columna. Posteriormente se indicará la condición lógica para filtrar las filas y por último todo esto se asignará al data frame para que nos arroje los resultados.

Por ejemplo, si solo deseamos quedarnos con los individuos de género masculino, entonces usaremos la siguiente sintaxis.

# Quedándonos solo con los individuos de género masculino.
df[df$GENERO=="Masculino",]
##    EDAD    GENERO ingresos   raza material_casa EXPERIENCIA num_hijos
## 2    15 Masculino     2144 blanco         noble           6         4
## 3    23 Masculino     2822  negro       rustica          10         4
## 8    15 Masculino     3202 blanco         noble           0         4
## 9    15 Masculino     2527 blanco         noble          12         4
## 11   14 Masculino     4440 blanco         noble          13         4
## 13   16 Masculino     3981 blanco         noble          13         4
## 16   28 Masculino     2486  negro         noble          13         2
## 17   27 Masculino     2745  negro         noble          12         0
## 19   23 Masculino     4602  negro       rustica          15         2
## 21   13 Masculino     4051 blanco         noble          10         3
## 26   13 Masculino     1509 blanco         noble           1         4
## 27   30 Masculino     4829  negro         noble           2         0
## 29   18 Masculino     1789 blanco         noble           6         1

En efecto, hemos filtrado a las filas que son del género “Masculino”. Pero ¿Cómo lo hemos hecho? Primero llamamos a la columna GENERO con la sintaxis df$GENERO luego indicamos la condición lógica que nos filtre solo los de genero “Masculino”, esto se logra con df$GENERO=="Masculino", posteriormente colocamos esta sintaxis dentro de data frame df y al final colocamos la , a lo que nos queda df[df$GENERO=="Masculino",]. ¿Por qué colocamos la coma , al final? Porque estamos filtrando por filas, recuerde que sintaxis antes de la como significa filtrar filas y sintaxis luego de la como significa selección columnas.

Veamos un ejemplo adicional para que quede un poco más claro. Ahora vamos a filtrar a los individuos que tienen una experiencia mayor a 5 años.

# Filtrando individuos que tienen una experiencia mayor a 5 años.
df[df$EXPERIENCIA>5,]
##    EDAD    GENERO ingresos   raza material_casa EXPERIENCIA num_hijos
## 1    16  Femenino     1680  negro         noble          15         1
## 2    15 Masculino     2144 blanco         noble           6         4
## 3    23 Masculino     2822  negro       rustica          10         4
## 4    16  Femenino     3558 blanco       rustica          12         4
## 9    15 Masculino     2527 blanco         noble          12         4
## 11   14 Masculino     4440 blanco         noble          13         4
## 13   16 Masculino     3981 blanco         noble          13         4
## 14   18  Femenino     1621 blanco       rustica           6         4
## 15   21  Femenino     4197 blanco       rustica          15         2
## 16   28 Masculino     2486  negro         noble          13         2
## 17   27 Masculino     2745  negro         noble          12         0
## 19   23 Masculino     4602  negro       rustica          15         2
## 20   17  Femenino     2551  negro         noble           9         0
## 21   13 Masculino     4051 blanco         noble          10         3
## 24   11  Femenino     3686 blanco       rustica          13         3
## 25   28  Femenino     1361 blanco       rustica           7         4
## 29   18 Masculino     1789 blanco         noble           6         1

Si usted se da cuenta solo hemos obtenido las filas en donde la experiencia es mayor a 5 años.

Por último, vamos a filtrar usando más de un operador lógico, por ejemplo vamos a filtrar a los individuos que son de raza negra y que el material de su casa sea de material noble.

# Quedándonos con los individuos que son de raza negra y que el 
# material de su casa es de material noble.
df[df$raza=="negro" & df$material_casa=="noble",]
##    EDAD    GENERO ingresos  raza material_casa EXPERIENCIA num_hijos
## 1    16  Femenino     1680 negro         noble          15         1
## 6    29  Femenino     4784 negro         noble           2         4
## 16   28 Masculino     2486 negro         noble          13         2
## 17   27 Masculino     2745 negro         noble          12         0
## 20   17  Femenino     2551 negro         noble           9         0
## 27   30 Masculino     4829 negro         noble           2         0
## 28   14  Femenino     3347 negro         noble           2         4

Y en efecto, hemos obtenido el resultado deseado.

Con R base la sintaxis no es tan limpia, pero es muy intuitiva. Pero si queremos tener una sintaxis más limpia y a la vez intuitiva, entonces tendremos que usar el paquete dplyr. Pero más adelante, veremos que usando la función subset() de R base se logra lo mismo, pero con una sintaxis más sencilla aún, pero no tan escalable como la que se obtendría con el paquete dplyr.

12.3.2 Dplyr - Usando la función filter.

Para filtrar por filas usando el paquete dplyr usaremos la función filter(). La sintaxis es similar al que se usó con R base, pero no es necesario usar el operador $ ya que este paquete nos permite trabajar por etapas, es así que si primero llamamos al data frame, en las siguientes sintaxis no será necesario volver a llamarlo.

Para ver las diferencias, realizaremos los mismos ejemplos que se hicieron con R base. Entonces, primero filtraremos los que son de género “Masculino”.

# Filtrando los que son de género masculino.
df %>% filter(GENERO=="Masculino")
##    EDAD    GENERO ingresos   raza material_casa EXPERIENCIA num_hijos
## 1    15 Masculino     2144 blanco         noble           6         4
## 2    23 Masculino     2822  negro       rustica          10         4
## 3    15 Masculino     3202 blanco         noble           0         4
## 4    15 Masculino     2527 blanco         noble          12         4
## 5    14 Masculino     4440 blanco         noble          13         4
## 6    16 Masculino     3981 blanco         noble          13         4
## 7    28 Masculino     2486  negro         noble          13         2
## 8    27 Masculino     2745  negro         noble          12         0
## 9    23 Masculino     4602  negro       rustica          15         2
## 10   13 Masculino     4051 blanco         noble          10         3
## 11   13 Masculino     1509 blanco         noble           1         4
## 12   30 Masculino     4829  negro         noble           2         0
## 13   18 Masculino     1789 blanco         noble           6         1

Y en efecto, obtenemos el mismo resultado. A continuación realizaremos los mismos filtros que se hicieron con R base.

# filtrando los que tienen experiencia mayor a 5.
df %>% filter(EXPERIENCIA>5)
##    EDAD    GENERO ingresos   raza material_casa EXPERIENCIA num_hijos
## 1    16  Femenino     1680  negro         noble          15         1
## 2    15 Masculino     2144 blanco         noble           6         4
## 3    23 Masculino     2822  negro       rustica          10         4
## 4    16  Femenino     3558 blanco       rustica          12         4
## 5    15 Masculino     2527 blanco         noble          12         4
## 6    14 Masculino     4440 blanco         noble          13         4
## 7    16 Masculino     3981 blanco         noble          13         4
## 8    18  Femenino     1621 blanco       rustica           6         4
## 9    21  Femenino     4197 blanco       rustica          15         2
## 10   28 Masculino     2486  negro         noble          13         2
## 11   27 Masculino     2745  negro         noble          12         0
## 12   23 Masculino     4602  negro       rustica          15         2
## 13   17  Femenino     2551  negro         noble           9         0
## 14   13 Masculino     4051 blanco         noble          10         3
## 15   11  Femenino     3686 blanco       rustica          13         3
## 16   28  Femenino     1361 blanco       rustica           7         4
## 17   18 Masculino     1789 blanco         noble           6         1
# Filtrando los que son de raza negra y material de casa noble.
df %>% filter(raza=="negro" & material_casa=="noble")
##   EDAD    GENERO ingresos  raza material_casa EXPERIENCIA num_hijos
## 1   16  Femenino     1680 negro         noble          15         1
## 2   29  Femenino     4784 negro         noble           2         4
## 3   28 Masculino     2486 negro         noble          13         2
## 4   27 Masculino     2745 negro         noble          12         0
## 5   17  Femenino     2551 negro         noble           9         0
## 6   30 Masculino     4829 negro         noble           2         0
## 7   14  Femenino     3347 negro         noble           2         4

Como se mencionó hemos usado una sintaxis similar, pero más limpia y a la vez igual de intuitiva.

12.3.3 Filtrando usando la función subset de R base.

Pero R base no se queda atrás y tiene la función subset() que es igual al filter() del paquete dplyr. Veamos lo fácil de usarla.

Vamos a desarrollar el último ejemplo que hemos visto tanto con el paquete dplyr y R base.

# Filtrando los que son de raza negra y material de casa noble.
subset(df, raza=="negro" & material_casa=="noble")
##    EDAD    GENERO ingresos  raza material_casa EXPERIENCIA num_hijos
## 1    16  Femenino     1680 negro         noble          15         1
## 6    29  Femenino     4784 negro         noble           2         4
## 16   28 Masculino     2486 negro         noble          13         2
## 17   27 Masculino     2745 negro         noble          12         0
## 20   17  Femenino     2551 negro         noble           9         0
## 27   30 Masculino     4829 negro         noble           2         0
## 28   14  Femenino     3347 negro         noble           2         4

En efecto, hemos obtenido el mismo resultado. Es un calco de la función filter, incluso es más integral, ya que la función subset() permite seleccionar columnas en la misma sintaxis. Vamos a ver esto en el siguiente apartado y usted elegirá cuál es la forma que más se adapta a su forma de pensar.

12.4 filtrando y seleccionado columnas.

En este sección desarrollaremos ejemplos de filtrar filas y seleccionar columnas a la vez. Es así que usaremos todo lo aprendido en este capítulo y uniremos sintaxis.

Para ver las diferencias, vamos a desarrollar un único ejemplo en donde filtraremos las filas que tienen ingresos mayores a 2000, que sean de raza negra y seleccionaremos solo las columnas ingresos, raza y edad.

Empezaremos con R base, luego con el paquete dplyr y por último con la función subset().

# Usando R base.
df[df$ingresos>2000 & df$raza=="negro", c("ingresos","raza","EDAD")]
##    ingresos  raza EDAD
## 3      2822 negro   23
## 6      4784 negro   29
## 16     2486 negro   28
## 17     2745 negro   27
## 18     4656 negro   12
## 19     4602 negro   23
## 20     2551 negro   17
## 27     4829 negro   30
## 28     3347 negro   14
# Usando el paquete dplyr.
df %>% filter(ingresos>2000 & raza=="negro") %>% select(ingresos,raza,EDAD)
##   ingresos  raza EDAD
## 1     2822 negro   23
## 2     4784 negro   29
## 3     2486 negro   28
## 4     2745 negro   27
## 5     4656 negro   12
## 6     4602 negro   23
## 7     2551 negro   17
## 8     4829 negro   30
## 9     3347 negro   14
# Usando la función subset.
subset(df, ingresos>2000 & raza=="negro", select=c("ingresos","raza","EDAD"))
##    ingresos  raza EDAD
## 3      2822 negro   23
## 6      4784 negro   29
## 16     2486 negro   28
## 17     2745 negro   27
## 18     4656 negro   12
## 19     4602 negro   23
## 20     2551 negro   17
## 27     4829 negro   30
## 28     3347 negro   14

En efecto, hemos obtenido los mismos resultados con las 3 sintaxis, de usted dependerá cual usar. cada una tiene sus ventajas y desventajas y dependerá del proceso que estemos haciendo y del resultado que deseamos obtener. Se recomienda usar R base a la hora de crear funciones; dplyr, si vamos a desarrollar más operaciones luego de filtrar y seleccionar por ejemplo, agrupar por filas, graficar, generar tablas, entre otras. Y subset() si y solo si lo único que haremos es filtrar y seleccionar.

Como se mencionó, esta no es la única forma de filtrar y seleccionar, estas tres formas es probable que a usted le resulten insuficientes, ya que si usted trabaja con grandes datos, lo mejor sería que usted use el paquete data.table o sparklyr u otros22. R al ser un software libre y abierto tiene una gran variedad de opciones, eso es lo que lo convierte en un excepcional software ya que para cada situación usted podrá realizar una sintaxis adecuada y óptima.


  1. Podría dejar el directorio de trabajo en esa ruta, pero si quisiera importar el archivo que deseo tendría que especificar la ruta del archivo y eso me demoraría más tiempo, ya que tendría que escribir la ruta completa cada vez que deseo cargar un archivo.↩︎

  2. En ejemplos posteriores se mostrará como importar archivos desde otra ruta.↩︎

  3. El paquete foreign solo lee archivos stata de la versión 5 a la 12, mientras que haven lee archivos hasta la versión 16 del stata.↩︎

  4. Este es un libro introducctorio al software R en donde se muestran las sintaxis básicas y quizá hasta intermedias, por lo que escapa del tema del bigdata, que es un tema especializado, y por ende, no visto en este libro.↩︎