2.2 Manipulación de datos
Una vez cargada una (o varias) bases de datos hay una series de operaciones que serán de interés para el tratamiento de datos:
- Operaciones con variables:
- crear
- recodificar (e.g. categorizar)
- …
- Operaciones con casos:
- ordenar
- filtrar
- …
- Operaciones con tablas de datos:
- unir
- combinar
- consultar
- …
A continuación se tratan algunas operaciones básicas.
2.2.1 Operaciones con variables
2.2.1.1 Creación (y eliminación) de variables
Consideremos de nuevo la
base de datos cars
incluida en el paquete datasets
:
## speed dist
## 1 4 2
## 2 4 10
## 3 7 4
## 4 7 22
## 5 8 16
## 6 9 10
Utilizando el comando help(cars)
se obtiene que cars
es un data.frame con 50 observaciones y dos
variables:
speed
: Velocidad (millas por hora)dist
: tiempo hasta detenerse (pies)
Recordemos que, para acceder a la variable speed
se puede
hacer directamente con su nombre o bien utilizando notación
“matricial”.
## [1] 4 4 7 7 8 9 10 10 10 11 11 12 12 12 12 13 13 13 13 14 14 14 14
## [24] 15 15 15 16 16 17 17 17 18 18 18 18 19 19 19 20 20 20 20 20 22 23 24
## [47] 24 24 24 25
## [1] 4 4 7 7 8 9 10 10 10 11 11 12 12 12 12 13 13 13 13 14 14 14 14
## [24] 15 15 15 16 16 17 17 17 18 18 18 18 19 19 19 20 20 20 20 20 22 23 24
## [47] 24 24 24 25
Supongamos ahora que queremos transformar la variable original speed
(millas por hora) en una nueva variable velocidad
(kilómetros por
hora) y añadir esta nueva variable al data.frame cars
.
La transformación que permite pasar millas a kilómetros es
kilómetros=millas/0.62137
que en R se hace directamente con:
Finalmente, incluimos la nueva variable que llamaremos
velocidad
en cars
:
## speed dist velocidad
## 1 4 2 6.437388
## 2 4 10 6.437388
## 3 7 4 11.265430
## 4 7 22 11.265430
## 5 8 16 12.874777
## 6 9 10 14.484124
También transformaremos la variable dist
(en pies) en una nueva
variable distancia
(en metros). Ahora la transformación deseada es
metros=pies/3.2808
:
## speed dist velocidad distancia
## 1 4 2 6.437388 0.6096074
## 2 4 10 6.437388 3.0480371
## 3 7 4 11.265430 1.2192148
## 4 7 22 11.265430 6.7056815
## 5 8 16 12.874777 4.8768593
## 6 9 10 14.484124 3.0480371
Ahora, eliminaremos las variables originales speed
y
dist
, y guardaremos el data.frame resultante con el nombre coches
.
En primer lugar, veamos varias formas de acceder a las variables de
interés:
Utilizando alguna de las opciones anteriores se obtiene el data.frame
deseado:
## 'data.frame': 50 obs. of 2 variables:
## $ velocidad: num 6.44 6.44 11.27 11.27 12.87 ...
## $ distancia: num 0.61 3.05 1.22 6.71 4.88 ...
Finalmente los datos anteriores podrían ser guardados en un fichero exportable a Excel con el siguiente comando:
2.2.2 Operaciones con casos
2.2.2.1 Ordenación
Continuemos con el data.frame cars
.
Se puede comprobar que los datos disponibles están ordenados por
los valores de speed
. A continuación haremos la ordenación utilizando
los valores de dist
. Para ello utilizaremos el conocido como vector de
índices de ordenación.
Este vector establece el orden en que tienen que ser elegidos los
elementos para obtener la ordenación deseada.
Veamos un ejemplo sencillo:
## [1] 3 1 4 2 5
## [1] 1.2 2.5 3.1 4.3 5.0
En el caso de vectores, el procedimiento anterior se podría hacer directamente con:
Sin embargo, para ordenar data.frames será necesario la utilización del
vector de índices de ordenación. A continuación, los datos de cars
ordenados por dist
:
ii <- order(cars$dist) # Vector de índices de ordenación
cars2 <- cars[ii, ] # Datos ordenados por dist
head(cars2)
## speed dist velocidad distancia
## 1 4 2 6.437388 0.6096074
## 3 7 4 11.265430 1.2192148
## 2 4 10 6.437388 3.0480371
## 6 9 10 14.484124 3.0480371
## 12 12 14 19.312165 4.2672519
## 5 8 16 12.874777 4.8768593
2.2.2.2 Filtrado
El filtrado de datos consiste en
elegir una submuestra que cumpla determinadas condiciones. Para ello se
puede utilizar la función subset()
(que además permite seleccionar variables).
A continuación se muestran un par de ejemplos:
## speed dist velocidad distancia
## 47 24 92 38.62433 28.04194
## 48 24 93 38.62433 28.34674
## 49 24 120 38.62433 36.57644
## speed dist velocidad distancia
## 19 13 46 20.92151 14.02097
## 22 14 60 22.53086 18.28822
## 23 14 80 22.53086 24.38430
También se pueden hacer el filtrado empleando directamente los correspondientes vectores de índices:
## speed dist velocidad distancia
## 47 24 92 38.62433 28.04194
## 48 24 93 38.62433 28.34674
## 49 24 120 38.62433 36.57644
## speed dist velocidad distancia
## 19 13 46 20.92151 14.02097
## 22 14 60 22.53086 18.28822
## 23 14 80 22.53086 24.38430
En este caso puede ser de utilidad la función which()
:
## int [1:3] 19 22 23
## speed dist
## 19 13 46
## 22 14 60
## 23 14 80
## 'data.frame': 47 obs. of 2 variables:
## $ speed: num 4 4 7 7 8 9 10 10 10 11 ...
## $ dist : num 2 10 4 22 16 10 18 26 34 17 ...
2.2.3 Funciones apply
2.2.3.1 La función apply
Una forma de evitar la
utilización de bucles es utilizando la sentencia apply
que permite
evaluar una misma función en todas las filas, columnas, etc. de un array
de forma simultánea.
La sintaxis de esta función es:
X
: matriz (o array)MARGIN
: Un vector indicando las dimensiones donde se aplicará la función. 1 indica filas, 2 indica columnas, yc(1,2)
indica filas y columnas.FUN
: función que será aplicada....
: argumentos opcionales que serán usados porFUN
.
Veamos la utilización de la función apply
con un ejemplo:
## [,1] [,2] [,3]
## [1,] 1 4 7
## [2,] 2 5 8
## [3,] 3 6 9
## [1] 12 15 18
## [1] 6 15 24
## [1] 1 4 7
## [,1] [,2] [,3]
## [1,] 1 4 7
## [2,] 3 6 9
2.2.3.2 Variantes de la función apply
## List of 4
## $ speed : num 15
## $ dist : num 36
## $ velocidad: num 24.1
## $ distancia: num 11
# matriz con las medias, medianas y desv. de las variables
res <- sapply(cars,
function(x) c(mean = mean(x), median = median(x), sd = sd(x)))
# str(res)
res
## speed dist velocidad distancia
## mean 15.400000 42.98000 24.783945 13.100463
## median 15.000000 36.00000 24.140206 10.972933
## sd 5.287644 25.76938 8.509655 7.854602
mean | median | sd | |
---|---|---|---|
speed | 15.4 | 15.0 | 5.3 |
dist | 43.0 | 36.0 | 25.8 |
velocidad | 24.8 | 24.1 | 8.5 |
distancia | 13.1 | 11.0 | 7.9 |
## [1] 5.50000 5.50000 3.02765
## speed dist velocidad distancia
## [1,] 15.400000 42.98000 24.783945 13.100463
## [2,] 15.000000 36.00000 24.140206 10.972933
## [3,] 5.287644 25.76938 8.509655 7.854602
## mean median sd
## 5.50000 5.50000 3.02765
2.2.3.3 La función tapply
La function tapply()
es
similar a la función apply()
y permite aplicar una función a los datos desagregados,
utilizando como criterio los distintos niveles de una variable factor.
La sintaxis de esta función es como sigue:
X
: matriz (o array).INDEX
: factor indicando los grupos (niveles).FUN
: función que será aplicada....
: argumentos opcionales .
Consideremos, por ejemplo, el data.frame ChickWeight
con datos de un
experimento relacionado con la repercusión de varias dietas en el peso
de pollos.
## weight Time Chick Diet
## 1 42 0 1 1
## 2 51 2 1 1
## 3 59 4 1 1
## 4 64 6 1 1
## 5 76 8 1 1
## 6 93 10 1 1
peso <- ChickWeight$weight
dieta <- ChickWeight$Diet
levels(dieta) <- c("Dieta 1", "Dieta 2", "Dieta 3", "Dieta 4")
tapply(peso, dieta, mean) # Peso medio por dieta
## Dieta 1 Dieta 2 Dieta 3 Dieta 4
## 102.6455 122.6167 142.9500 135.2627
## $`Dieta 1`
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 35.00 57.75 88.00 102.65 136.50 305.00
##
## $`Dieta 2`
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 39.0 65.5 104.5 122.6 163.0 331.0
##
## $`Dieta 3`
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 39.0 67.5 125.5 142.9 198.8 373.0
##
## $`Dieta 4`
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 39.00 71.25 129.50 135.26 184.75 322.00
Otro ejemplo:
provincia <- as.factor(c(1, 3, 4, 2, 4, 3, 2, 1, 4, 3, 2))
levels(provincia) = c("A Coruña", "Lugo", "Orense", "Pontevedra")
hijos <- c(1, 2, 0, 3, 4, 1, 0, 0, 2, 3, 1)
data.frame(provincia, hijos)
## provincia hijos
## 1 A Coruña 1
## 2 Orense 2
## 3 Pontevedra 0
## 4 Lugo 3
## 5 Pontevedra 4
## 6 Orense 1
## 7 Lugo 0
## 8 A Coruña 0
## 9 Pontevedra 2
## 10 Orense 3
## 11 Lugo 1
## A Coruña Lugo Orense Pontevedra
## 0.500000 1.333333 2.000000 2.000000
2.2.4 Operaciones con tablas de datos
Ver ejemplo wosdata.R
Unir tablas:
Combinar tablas:
match(x, table)
devuelve un vector (de la misma longitud que x
)
con las (primeras) posiciones de coincidencia de x
en table
(o NA
, por defecto, si no hay coincidencia).
Para combinar tablas puede ser más cómodo el operador %in%
(?'%in%'
).