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)
<-data.frame(edad=sample(10:30, 10, T),
dfsexo=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)
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)
<-data.frame(edad=sample(10:30, 30, T),
dfsexo=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 dplyr
19, 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.
2] df[,
## [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.
c(1,3,6)] # Selección de las columnas 1, 3 y 6. df[,
## 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.
"GENERO"] df[,
## [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.
c("ingresos","raza")] df[,
## 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".
grepl("a$|O$",names(df))] 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.
%>% select("num_hijos") df
## 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.
%>% select("material_casa","EXPERIENCIA") df
## 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".
%>% select(starts_with("E")) df
## 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".
%>% select(ends_with("a")) df
## 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".
%>% select(contains("er")) df
## 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".
%>% select(matches("a$|O$")) df
## 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 dplyr
20.
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.
$GENERO=="Masculino",] df[df
## 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.
$EXPERIENCIA>5,] df[df
## 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.
$raza=="negro" & df$material_casa=="noble",] df[df
## 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.
%>% filter(GENERO=="Masculino") df
## 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.
%>% filter(EXPERIENCIA>5) df
## 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.
%>% filter(raza=="negro" & material_casa=="noble") df
## 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.
$ingresos>2000 & df$raza=="negro", c("ingresos","raza","EDAD")] df[df
## 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.
%>% filter(ingresos>2000 & raza=="negro") %>% select(ingresos,raza,EDAD) df
## 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.
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.↩︎
En ejemplos posteriores se mostrará como importar archivos desde otra ruta.↩︎
El paquete
foreign
solo lee archivos stata de la versión 5 a la 12, mientras quehaven
lee archivos hasta la versión 16 del stata.↩︎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.↩︎