En esta lección aprenderá sobre vectores, la estructura de datos mas simple y común en R.
Siempre que trabaje con un conjunto de datos nuevos, lo primero que debe hacer es explorarlo! Cuál es el formato de los datos? Cuántas dimensiones tiene? Cuáles son los nombres de las variables? Tienen vacios los datos? En esta lección aprenderá a responder estas preguntas con R.
Este material esta basado en la leccion de “Looking at Data” de “R Programming”, paquete swirl. Author: Nick Carchedi, Organization: JHU Biostat, Version: 2.2.11.
Comencemos ahora!
Utilizaremos un conjunto de datos disponible en R. Este se llama con cars y se accede con la función data(). Los conjuntos de datos disponibles en R pueden consultarse aqui https://stat.ethz.ch/R-manual/R-patched/library/datasets/html/00Index.html o ejecutando data() sin ningun argumento.
data(cars)
Lo primero es chequear la classe de cars con class(cars). Observará que se trata de un data.frame.
class(cars)
## [1] "data.frame"
Como cars esta almacenado en un data.frame, sabemos que es del tipo rectangular con filas y columnas. Use la función dim(cars) para conocer exactamente el número de filas y columnas.En el resultado observará que cars posee (50) filas (Observaciones) y (2) columnas (variables).
También puede usar nrow(cars) para ver el número de filas y ncol(cars) para el número de columnas.
dim(cars)
## [1] 50 2
nrow(cars)
## [1] 50
ncol(cars)
## [1] 2
Si tienes curiosidad por conocer cuando espacio ocupa cars en memoria, puede usar object.size(cars).
object.size(cars)
## 1576 bytes
Ahora exploremos el contenido de los datos. Comencemos con los nombres de las variables usando names(cars). El resulaltado será un vector con caracteres con los nombres de las columnas.
names(cars)
## [1] "speed" "dist"
El próximo paso es acceder a los datos mismos. Si los datos son muy numerosos,el mostrarlos todos puede llevar un tiempo, por ello la función head() permite previsualizar los primeros 6 datos de la tabla. Cada fila tendrá un indice como etiqueta y cada columna un nombre de variable.
Los 6 primeros valores son mostrados por defecto, pero podemos especificar otro número de elementos a visualizar, por ejemplo 10, con head(cars, 10).
Lo mismo aplica con tail() que muestra los últimos elementos de la tabla.
head(cars)
## speed dist
## 1 4 2
## 2 4 10
## 3 7 4
## 4 7 22
## 5 8 16
## 6 9 10
head(cars, 10)
## speed dist
## 1 4 2
## 2 4 10
## 3 7 4
## 4 7 22
## 5 8 16
## 6 9 10
## 7 10 18
## 8 10 26
## 9 10 34
## 10 11 17
tail(cars, 15)
## speed dist
## 36 19 36
## 37 19 46
## 38 19 68
## 39 20 32
## 40 20 48
## 41 20 52
## 42 20 56
## 43 20 64
## 44 22 66
## 45 23 54
## 46 24 70
## 47 24 92
## 48 24 93
## 49 24 120
## 50 25 85
Luego de previsualizar los primeros y últimos valores de la tabla, debemos conocer como de distribuyen los valores de las variables. Para ello usaremos la función summary(cars). summary() provee salidas para cada variable dependiendo del tipo de datos. Cuando los valores son numéricos, como en nuestro caso, summary() muestra el minimo, 1er cuartil, mediana, media mean, 3er cuartil, y máximo. Para variables categóricas (o de tipo texto), llamadas “factores” en R, summary() muestra el numero de veces que cada valor aparece en los datos (esto es llamado “level”).
summary(cars)
## speed dist
## Min. : 4.0 Min. : 2.00
## 1st Qu.:12.0 1st Qu.: 26.00
## Median :15.0 Median : 36.00
## Mean :15.4 Mean : 42.98
## 3rd Qu.:19.0 3rd Qu.: 56.00
## Max. :25.0 Max. :120.00
Otra función muy util es str() para conocer la estructura de los datos. Lo interesante de esta función es que combina varios elementos de otras funciones ya vistas, todo en un formato muy conciso. AL comienzo dice la clase de cars (data.frame), y el numero de dimensiones: 50 obs y 2 variables. Luego presenta el nombre y clase de cada variable, con una previsualización de su contenido.
str(cars)
## 'data.frame': 50 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 ...
Finalmente, para acceder a datos especificos, debemos usar la extracción de subconjunto de datos (subsetting), de manera similar a como lo hicimos con vectores, aunque algunos cambios son necesarios debido a la estructura de filas y columnas.
Si queremos obtener únicamente el valor para el primer carro (primera fila) debemos usar cars[1,]. El número 1 indica que es el primer carro, mientras que el espacio vacío luego de la coma hace referencia a que devuelva todas las columnas. Es decir que dentro de los corchetes deben indicase que filas y que columnas queremos obtener, esto separado por una coma.
Si, por el contrario, queremos todos los valores de velocidad de todos los carros usaremos cars[,1] y para todos los valores de distancia cars[,2].
Lo anterior también puede consultarse mediante el nombre de la columna, por ejemplo cars[,“speed”]
cars[1, 1]
## [1] 4
cars[,1]
## [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
cars[,2]
## [1] 2 10 4 22 16 10 18 26 34 17 28 14 20 24 28 26 34
## [18] 34 46 26 36 60 80 20 26 54 32 40 32 40 50 42 56 76
## [35] 84 36 46 68 32 48 52 56 64 66 54 70 92 93 120 85
cars[,"speed"]
## [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
Una determinada columna también pude solicitarse con cars$speed, donde el simbolo $ separa el nombre del data.frame y el nombre de la columna.
cars$speed
## [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
Al igual que con los vectores, podemos pedir un rango de elementos con cars[1:10,] o indices en concreto como cars[c(1,10),] donde solo obtenemo los valores de los indices 1 y 10.
También podemos utilizar operadores lógicos, por ejemplo para solicitar los carros con velocidades mayores a 95mph con cars[cars$speed >20,] o con velocidad igual a 20 con cars[cars$speed == 20,].
cars[1:10,]
## speed dist
## 1 4 2
## 2 4 10
## 3 7 4
## 4 7 22
## 5 8 16
## 6 9 10
## 7 10 18
## 8 10 26
## 9 10 34
## 10 11 17
cars[c(1,10),]
## speed dist
## 1 4 2
## 10 11 17
cars[cars$speed >20,]
## speed dist
## 44 22 66
## 45 23 54
## 46 24 70
## 47 24 92
## 48 24 93
## 49 24 120
## 50 25 85
cars[cars$speed == 20,]
## speed dist
## 39 20 32
## 40 20 48
## 41 20 52
## 42 20 56
## 43 20 64
La función subset() hace un trabajo parecido con newdata <- subset(cars, speed >= 20, ). Se requieren tres tipos de argumentos: primero el data.frame origen, segundo la condición logica a cumplir, y tercero que columnas se selecionarán (en este caso todas ya que se se especifica ningun elemento). Si se quisiera obtener solo la columna speed se indicaría de la siguiente manera newdata <- subset(cars, speed >= 20, “speed”).
newdata <- subset(cars, speed > 20, )
newdata
## speed dist
## 44 22 66
## 45 23 54
## 46 24 70
## 47 24 92
## 48 24 93
## 49 24 120
## 50 25 85
newdata <- subset(cars, speed >= 20, "speed")
newdata
## speed
## 39 20
## 40 20
## 41 20
## 42 20
## 43 20
## 44 22
## 45 23
## 46 24
## 47 24
## 48 24
## 49 24
## 50 25
Ha llegado al final de esta leccion!