Hay muchas operaciones que se pueden hacer en una base de datos, a continuación veremos algunas de las operaciones básicas además de la transformación de formatos largo a ancho y viceversa.
Para este tutorial utilizaremos una base de datos disponible en todas las versiones de R que se llama mtcars
. Para importarla al espacio de trabajo necesitamos correr el siguiente código:
data("mtcars")
Esta base de datos contiene información sobre características físicas y consumo de combustible de automóviles vendidos en Estados Unidos. Sobre esta base de datos haremos las siguientes operaciones:
Para este ejercicio utilizaremos el paquete plyr
, y si no lo tienen instalado se puede hacer con el siguiente código:
install.packages("plyr")
Para esta operación utilizaremos la función subset
que quiere decir subconjunto. Para poder realizar esta operación necesitamos conocer los nombres de las columnas de la base mtcars
mediante la función names
:
## [1] "mpg" "cyl" "disp" "hp" "drat" "wt" "qsec" "vs" "am" "gear"
## [11] "carb"
Para conocer el significado de cada una de las variables se puede consutar la ayuda de R:
?mtcars
Entonces para crear una tabla subconjunto de mtcars
que contenga las variables mpg
(millas por galón), cyl
(número de cilindros) y hp
(caballos de fuerza), corremos el código siguiente:
mtcars.1 <- subset(mtcars, select = c("mpg", "cyl", "hp"))
El prier argumento es la nombre del objeto que contiene la tabla que queremos procesar (mtcars
), el segundo argumento, select
es una cadena de caracteres que contenga los nombres de las columnas que queremos extraer (resultado en tabla 1.1).
mpg | cyl | hp | |
---|---|---|---|
Mazda RX4 | 21.0 | 6 | 110 |
Mazda RX4 Wag | 21.0 | 6 | 110 |
Datsun 710 | 22.8 | 4 | 93 |
Hornet 4 Drive | 21.4 | 6 | 110 |
Hornet Sportabout | 18.7 | 8 | 175 |
Valiant | 18.1 | 6 | 105 |
Como resulta evidente, el resultado es otra tabla, con el mismo formato pero que sólo contiene las columnas que indicamos a la función subset
Al igual que ya extrajimos sólo una fracción de las columnas podemos extraer filas. Al decir condicionalmente nos referimos a que necesitamos identificar un criterio para extraer las filas. Por ejemplo, la variable vs
indica si un vehículo tiene motor en v (0) ó en línea (1). Entonces si deseamos crear una base que contenga sólo los datos para vehículos con motor en v:
mtcars.vs <- subset(mtcars, vs == 0)
la condición para crear el subconjunto es que la variable vs
valga 0
. El operador ==
es de tipo lógico e indica igual a. Otros operadores lógicos son:
!=
, diferente de>
, mayor que<
, menor quePor lo tanto, las siguientes son algunas alternativas para hacer la misma operación:
subset(mtcars, vs != 1)
subset(mtcars, vs < 1)
Asimismo, es posible utilizsar más de un criterio de manera simultánea, por ejemplo extrayendo las filas donde vs == 0
y am == 1
(automático–0– o manual–1):
mtcars.2 <- subset(mtcars, vs == 0 & am == 1)
En ocasiones es necesario capturar datos en tablas separadas, de modo que aprender a unirlas es una habilidad importante. Hay diferentes maneras de unir tablas:
Al efectuar esta operación estamos introduciendo variables nuevas a una tabla, y por lo tanto nuevas descripciones de nuestras unidades observacionales. Por lo tanto es de suma importancia que las filas coincidan para cada una de las unidades y que ambas tablas a unir tengan el mismo número de filas. Por ejemplo, si hubiésemos capturado la base mtcars
en dos tablas separadas, tenemos que asegurarnos de que la fila 1 de ambas bases contenga la información necesaria del vehículo Mazda RX4
. Las tablas 3.1 y 3.2 muestran a mtcars
dividida en dos.
mpg | cyl | disp | hp | drat | |
---|---|---|---|---|---|
Mazda RX4 | 21.0 | 6 | 160 | 110 | 3.90 |
Mazda RX4 Wag | 21.0 | 6 | 160 | 110 | 3.90 |
Datsun 710 | 22.8 | 4 | 108 | 93 | 3.85 |
Hornet 4 Drive | 21.4 | 6 | 258 | 110 | 3.08 |
Hornet Sportabout | 18.7 | 8 | 360 | 175 | 3.15 |
Valiant | 18.1 | 6 | 225 | 105 | 2.76 |
wt | qsec | vs | am | gear | |
---|---|---|---|---|---|
Mazda RX4 | 2.620 | 16.46 | 0 | 1 | 4 |
Mazda RX4 Wag | 2.875 | 17.02 | 0 | 1 | 4 |
Datsun 710 | 2.320 | 18.61 | 1 | 1 | 4 |
Hornet 4 Drive | 3.215 | 19.44 | 1 | 0 | 3 |
Hornet Sportabout | 3.440 | 17.02 | 0 | 0 | 3 |
Valiant | 3.460 | 20.22 | 1 | 0 | 3 |
Para unir estas dos tablas, podemos utilizar la función cbind
, que quiere decir column bind (unir columnas):
mtcars.f <- cbind(mtcars.l, mtcars.d)
Los argumentos que se utilizan en cbind
son todas las tablas que querramos unir en una misma base de datos.
Así como en la adición de columnas teníamos que asegurarnos de tener el mismo número de filas, para añadir filas tenemos que asegurarnos de tener el mismo número de columnas, de modo que las variables que continene cada una de las tablas sean las mismas y en el mismo orden. La función que realiza esta operación es rbind
, y funciona de la misma manera que cbind
:
mtcars.f2 <- rbind(mtcars.t, mtcars.b)
En frecuente que las bases de datos no sigan un órden lógico, a menos que hayan sido colectadas de manera secuencia como en una línea temporal. Por lo tanto es de suma utilidad saber cómo se puede ordenar una base de datos. Como es de esperarse, se debe cumplir que el criterio de ordenamiento, debe afectar a todas las columnas, de modo que no se mezcle la información que corresponde con individuos distintos. Aquí cabe hacer una advertencia, y es que ordenar una columna es un ejercicio muy sencillo, que se puede hacer en Excel, sin embargo, por defecto el orden sólo se aplica a una columna lo que invalida toda la base de datos.
Para ordenar una tabla en R utilizaremos el paquete plyr
. Para instalarlo podemos ejecutar la siquiente línea de código:
install.packages("dplyr")
Y para abrirlo una vez instalado:
library(dplyr)
El paquete dplyr
utiliza una sintaxis un tanto diferente de muchos paquetes de R. Normalmente, se llama la función y dentro de los paréntesis se indica al objeto que se procesará. En este caso, primero se llama el objeto (mtcars
, por ejemplo) y después se indica la función que se aplicará al objeto y los argumentos siguientes depués del operador %>%
. La función que ordena una tabla es arrange
:
mtcars.desc <- mtcars %>% arrange(desc(mpg))
donde hemos creado un nuevo objeto mtcars.desc
ordenado de mayor a menor (descendiente) con base en la columna mpg
. Para ordenar ascendentemente (tabla 4.1):
mtcars.asc <- mtcars %>% arrange(mpg)
mpg | cyl | disp | hp | drat | wt | qsec | vs | am | gear | carb | |
---|---|---|---|---|---|---|---|---|---|---|---|
Toyota Corolla | 33.9 | 4 | 71.1 | 65 | 4.22 | 1.835 | 19.90 | 1 | 1 | 4 | 1 |
Fiat 128 | 32.4 | 4 | 78.7 | 66 | 4.08 | 2.200 | 19.47 | 1 | 1 | 4 | 1 |
Honda Civic | 30.4 | 4 | 75.7 | 52 | 4.93 | 1.615 | 18.52 | 1 | 1 | 4 | 2 |
Lotus Europa | 30.4 | 4 | 95.1 | 113 | 3.77 | 1.513 | 16.90 | 1 | 1 | 5 | 2 |
Fiat X1-9 | 27.3 | 4 | 79.0 | 66 | 4.08 | 1.935 | 18.90 | 1 | 1 | 4 | 1 |
Porsche 914-2 | 26.0 | 4 | 120.3 | 91 | 4.43 | 2.140 | 16.70 | 0 | 1 | 5 | 2 |
Este método, puede aplicarse con más de una columna en mente, priorizando de izquierda a derecha:
mtcars.ord1 <- mtcars %>% arrange(mpg, desc(hp))
Las bases de datos se pueden resumir de algunas maneras, por ejemplo en mtcars
podríamos calcular el consumo promedio de combustible de los vehículos con 4, 6 y 8 cilindros. Además del promedio también podríamos obtener la desviación estándar. No son operaciones complicadas, pero cuando la base de datos es grande, hacerlo a mano puede requerir de mucho tiempo. Afortunadamente, contamos con dplyr
para ejecutar esta opeación de manera eficiente, con la función group_by
y summarise
(tabla 5.1):
mtcars.prom <- mtcars %>% group_by(cyl) %>% summarise(mpg = mean(mpg), hp = mean(hp))
cyl | mpg | hp |
---|---|---|
4 | 26.66364 | 82.63636 |
6 | 19.74286 | 122.28571 |
8 | 15.10000 | 209.21429 |