Documento 2 Practica Data Frames y Funciones
Cargamos el paquete necesario para la visualización de tablas:
2.1 Manipulación de Data Frames.
- Importar el dataset HairEyeColor.
- Si el dataset importado no es un dataframe, convertirlo.
## [1] FALSE
## [1] "character"
Entonces, lo convertimos:
## [1] TRUE
- Analizar la estructura del dataset, tipo de datos, estructura, clase, etc.
## [1] "data.frame"
## 'data.frame': 32 obs. of 4 variables:
## $ Hair: Factor w/ 4 levels "Black","Brown",..: 1 2 3 4 1 2 3 4 1 2 ...
## $ Eye : Factor w/ 4 levels "Brown","Blue",..: 1 1 1 1 2 2 2 2 3 3 ...
## $ Sex : Factor w/ 2 levels "Male","Female": 1 1 1 1 1 1 1 1 1 1 ...
## $ Freq: num 32 53 10 3 11 50 10 30 10 25 ...
## Hair Eye Sex Freq
## Black:8 Brown:8 Male :16 Min. : 2.00
## Brown:8 Blue :8 Female:16 1st Qu.: 7.00
## Red :8 Hazel:8 Median :10.00
## Blond:8 Green:8 Mean :18.50
## 3rd Qu.:29.25
## Max. :66.00
- Obtener número de columnas, número de filas.
## [1] 32
## [1] 4
También podríamos haber usado dim(color).
- Guardar en un vector el nombre de las columnas.
## [1] "Hair" "Eye" "Sex" "Freq"
- Cambiar el nombre de la primera columna.
## [1] "Pelo" "Eye" "Sex" "Freq"
- Averiguar el tipo de datos de la primera columna.
## [1] "factor"
- Comando para averiguar si hay valores NA en todo el dataframe, y lo mismo en la columna 1.
## [1] FALSE
## [1] FALSE
- Practicar con el dataset para extraer un conjunto de filas y/o columnas.
En este ejemplo queremos extraer las filas 1,2,3 y 20 y las columnas 2 y 3.
## Eye Sex
## 1 Brown Male
## 2 Brown Male
## 3 Brown Male
## 20 Brown Female
- Guardar cinco primeras filas en una variable d1 y las cinco últimas en una variable d2 y combinarlas en un nuevo dataframe llamado d12.
Pelo | Eye | Sex | Freq |
---|---|---|---|
Black | Brown | Male | 32 |
Brown | Brown | Male | 53 |
Red | Brown | Male | 10 |
Blond | Brown | Male | 3 |
Black | Blue | Male | 11 |
Pelo | Eye | Sex | Freq | |
---|---|---|---|---|
28 | Blond | Hazel | Female | 5 |
29 | Black | Green | Female | 2 |
30 | Brown | Green | Female | 14 |
31 | Red | Green | Female | 7 |
32 | Blond | Green | Female | 8 |
Pelo | Eye | Sex | Freq | |
---|---|---|---|---|
1 | Black | Brown | Male | 32 |
2 | Brown | Brown | Male | 53 |
3 | Red | Brown | Male | 10 |
4 | Blond | Brown | Male | 3 |
5 | Black | Blue | Male | 11 |
28 | Blond | Hazel | Female | 5 |
29 | Black | Green | Female | 2 |
30 | Brown | Green | Female | 14 |
31 | Red | Green | Female | 7 |
32 | Blond | Green | Female | 8 |
A continuación, utilizar el comando subset para extraer, eliminar, etc. un conjunto de columnas de un data set.
Subset: Devuelve subconjuntos de vectores, matrices o dataframes que cumplen condiciones.
- Usar subset para guardar en una variable las filas de dataset con valor para eye de Blue.
## [1] "Eye"
OjosAzules <- subset(color, color[2] == "Blue")
# Otra forma sin usar subset
# OjosAzules2 <- color[color$Eye =="Blue", ]
formattable(OjosAzules)
Pelo | Eye | Sex | Freq | |
---|---|---|---|---|
5 | Black | Blue | Male | 11 |
6 | Brown | Blue | Male | 50 |
7 | Red | Blue | Male | 10 |
8 | Blond | Blue | Male | 30 |
21 | Black | Blue | Female | 9 |
22 | Brown | Blue | Female | 34 |
23 | Red | Blue | Female | 7 |
24 | Blond | Blue | Female | 64 |
- Guardar la primera columna en variable d y utilizar los comandos unique, table. ¿Para qué sirven estos comandos?.
d <- color[][1] # Lo guardamos como dataframe
d_ <- color[ ,1] # Lo guardamos como factor
datatable(d)
Usamos la función unique que borra los elementos/columnas repetidas de un vector, data frame o array.
## Pelo
## 1 Black
## 2 Brown
## 3 Red
## 4 Blond
## [1] Black Brown Red Blond
## Levels: Black Brown Red Blond
Ahora, usamos la función table, que crea una tabla de contingencia con las variables y sus frecuencias.
## d
## Black Brown Red Blond
## 8 8 8 8
- Con la variable d usar colSums, colMeans. Explicar con ejemplos para qué sirven estos comandos.
Usamos la variable d2, en la cual almacenamos datos de tipo númerico en vez de tipo factor.
# colSumns suma todos los elementos de cada columna.
# En este caso, al sólo haber una (frecuencia) se obtiene un único dato:
colSums(d2)
## Freq
## 592
## Freq
## 18.5
- Explicar con ejemplos para qué sirven los comandos rowSums, rowMeans.
# Creamos el data frame a:
df1 <- data.frame (
foo = c( 15 , 9 , 13 , 12 , 11 , 14 , 15 , 11 , 9 , 10 , 12 , 13 ),
bar = c( 11 , 15 , 10 , 9 , 8 , 12 , 14 , 13 , 15 , 16 , 12 , 11 ),
baz = c( 8 , 10 , 9 , 10 , 11 , 13 , 15 , 14 , 14 , 13 , 13 , 10 )
)
row.names(df1) <- c('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec')
formattable(df1)
foo | bar | baz | |
---|---|---|---|
Jan | 15 | 11 | 8 |
Feb | 9 | 15 | 10 |
Mar | 13 | 10 | 9 |
Apr | 12 | 9 | 10 |
May | 11 | 8 | 11 |
Jun | 14 | 12 | 13 |
Jul | 15 | 14 | 15 |
Aug | 11 | 13 | 14 |
Sep | 9 | 15 | 14 |
Oct | 10 | 16 | 13 |
Nov | 12 | 12 | 13 |
Dec | 13 | 11 | 10 |
# Aplicamos rowSums, que suma todos los elementos de cada fila.
# En este caso, al sólo haber 12 filas se obtienen 12 datos:
rowSums(df1)
## Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
## 34 34 32 31 30 39 44 38 38 39 37 34
## Jan Feb Mar Apr May Jun Jul Aug
## 11.33333 11.33333 10.66667 10.33333 10.00000 13.00000 14.66667 12.66667
## Sep Oct Nov Dec
## 12.66667 13.00000 12.33333 11.33333
2.2 Errores más comunes.
Explica por qué los siguientes comandos dan error o no hacen lo que podría ser previsible con la lectura del comando. Arréglalo.
- library(datasets)
Carga el paquete ‘datasets’ en memoria, que contiene una lista de datasets por defecto. Para ver los datasets que contiene podemos ejecutar ‘data()’.
- data(“mtcars”)
Cargamos el paquete mtcars.
- mtcars[mtcars$cyl = 4, ]
Arreglamos el fallo cambiando ‘=’ por ‘==’, ya que estamos aplicando una operación lógica de igualdad, no asignando valores.
mpg | cyl | disp | hp | drat | wt | qsec | vs | am | gear | carb | |
---|---|---|---|---|---|---|---|---|---|---|---|
Datsun 710 | 22.8 | 4 | 108.0 | 93 | 3.85 | 2.320 | 18.61 | 1 | 1 | 4 | 1 |
Merc 240D | 24.4 | 4 | 146.7 | 62 | 3.69 | 3.190 | 20.00 | 1 | 0 | 4 | 2 |
Merc 230 | 22.8 | 4 | 140.8 | 95 | 3.92 | 3.150 | 22.90 | 1 | 0 | 4 | 2 |
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 |
Toyota Corolla | 33.9 | 4 | 71.1 | 65 | 4.22 | 1.835 | 19.90 | 1 | 1 | 4 | 1 |
Toyota Corona | 21.5 | 4 | 120.1 | 97 | 3.70 | 2.465 | 20.01 | 1 | 0 | 3 | 1 |
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 |
Lotus Europa | 30.4 | 4 | 95.1 | 113 | 3.77 | 1.513 | 16.90 | 1 | 1 | 5 | 2 |
Volvo 142E | 21.4 | 4 | 121.0 | 109 | 4.11 | 2.780 | 18.60 | 1 | 1 | 4 | 2 |
- mtcars[0:4, ]
Arreglamos el fallo cambiando ‘1’ por ‘0’, ya que si queremos seleccionar las primeras n filas no podemos poner números negativos (empezamos en 1).
mpg | cyl | disp | hp | drat | wt | qsec | vs | am | gear | carb | |
---|---|---|---|---|---|---|---|---|---|---|---|
Mazda RX4 | 21.0 | 6 | 160 | 110 | 3.90 | 2.620 | 16.46 | 0 | 1 | 4 | 4 |
Mazda RX4 Wag | 21.0 | 6 | 160 | 110 | 3.90 | 2.875 | 17.02 | 0 | 1 | 4 | 4 |
Datsun 710 | 22.8 | 4 | 108 | 93 | 3.85 | 2.320 | 18.61 | 1 | 1 | 4 | 1 |
Hornet 4 Drive | 21.4 | 6 | 258 | 110 | 3.08 | 3.215 | 19.44 | 1 | 0 | 3 | 1 |
- mtcars[mtcars$cyl <= 5]
Solucionamos el problema añadiendo una coma ‘,’, esto se debe a que debemos seleccionar un número de columnas ya que estamos trabajando con un data frame, por ello, seleccionamos todas las columnas (opción más razonable) de la siguiente manera:
mpg | cyl | disp | hp | drat | wt | qsec | vs | am | gear | carb | |
---|---|---|---|---|---|---|---|---|---|---|---|
Datsun 710 | 22.8 | 4 | 108.0 | 93 | 3.85 | 2.320 | 18.61 | 1 | 1 | 4 | 1 |
Merc 240D | 24.4 | 4 | 146.7 | 62 | 3.69 | 3.190 | 20.00 | 1 | 0 | 4 | 2 |
Merc 230 | 22.8 | 4 | 140.8 | 95 | 3.92 | 3.150 | 22.90 | 1 | 0 | 4 | 2 |
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 |
Toyota Corolla | 33.9 | 4 | 71.1 | 65 | 4.22 | 1.835 | 19.90 | 1 | 1 | 4 | 1 |
Toyota Corona | 21.5 | 4 | 120.1 | 97 | 3.70 | 2.465 | 20.01 | 1 | 0 | 3 | 1 |
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 |
Lotus Europa | 30.4 | 4 | 95.1 | 113 | 3.77 | 1.513 | 16.90 | 1 | 1 | 5 | 2 |
Volvo 142E | 21.4 | 4 | 121.0 | 109 | 4.11 | 2.780 | 18.60 | 1 | 1 | 4 | 2 |
- mtcars[mtcars$cyl == 4 | 6, ]
Solucionamos el problema diviendo las dos operaciones que se quieren ejecutar, debido a que se está aplicando un formato incorrecto al reconocido por R.
mpg | cyl | disp | hp | drat | wt | qsec | vs | am | gear | carb | |
---|---|---|---|---|---|---|---|---|---|---|---|
Mazda RX4 | 21.0 | 6 | 160.0 | 110 | 3.90 | 2.620 | 16.46 | 0 | 1 | 4 | 4 |
Mazda RX4 Wag | 21.0 | 6 | 160.0 | 110 | 3.90 | 2.875 | 17.02 | 0 | 1 | 4 | 4 |
Datsun 710 | 22.8 | 4 | 108.0 | 93 | 3.85 | 2.320 | 18.61 | 1 | 1 | 4 | 1 |
Hornet 4 Drive | 21.4 | 6 | 258.0 | 110 | 3.08 | 3.215 | 19.44 | 1 | 0 | 3 | 1 |
Valiant | 18.1 | 6 | 225.0 | 105 | 2.76 | 3.460 | 20.22 | 1 | 0 | 3 | 1 |
Merc 240D | 24.4 | 4 | 146.7 | 62 | 3.69 | 3.190 | 20.00 | 1 | 0 | 4 | 2 |
Merc 230 | 22.8 | 4 | 140.8 | 95 | 3.92 | 3.150 | 22.90 | 1 | 0 | 4 | 2 |
Merc 280 | 19.2 | 6 | 167.6 | 123 | 3.92 | 3.440 | 18.30 | 1 | 0 | 4 | 4 |
Merc 280C | 17.8 | 6 | 167.6 | 123 | 3.92 | 3.440 | 18.90 | 1 | 0 | 4 | 4 |
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 |
Toyota Corolla | 33.9 | 4 | 71.1 | 65 | 4.22 | 1.835 | 19.90 | 1 | 1 | 4 | 1 |
Toyota Corona | 21.5 | 4 | 120.1 | 97 | 3.70 | 2.465 | 20.01 | 1 | 0 | 3 | 1 |
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 |
Lotus Europa | 30.4 | 4 | 95.1 | 113 | 3.77 | 1.513 | 16.90 | 1 | 1 | 5 | 2 |
Ferrari Dino | 19.7 | 6 | 145.0 | 175 | 3.62 | 2.770 | 15.50 | 0 | 1 | 5 | 6 |
Volvo 142E | 21.4 | 4 | 121.0 | 109 | 4.11 | 2.780 | 18.60 | 1 | 1 | 4 | 2 |
- mtcars[1:20]
Solucionamos el problema de la misma manera que 5), seleccionando el número de columnas.
mpg | cyl | disp | hp | drat | wt | qsec | vs | am | gear | carb | |
---|---|---|---|---|---|---|---|---|---|---|---|
Mazda RX4 | 21.0 | 6 | 160.0 | 110 | 3.90 | 2.620 | 16.46 | 0 | 1 | 4 | 4 |
Mazda RX4 Wag | 21.0 | 6 | 160.0 | 110 | 3.90 | 2.875 | 17.02 | 0 | 1 | 4 | 4 |
Datsun 710 | 22.8 | 4 | 108.0 | 93 | 3.85 | 2.320 | 18.61 | 1 | 1 | 4 | 1 |
Hornet 4 Drive | 21.4 | 6 | 258.0 | 110 | 3.08 | 3.215 | 19.44 | 1 | 0 | 3 | 1 |
Hornet Sportabout | 18.7 | 8 | 360.0 | 175 | 3.15 | 3.440 | 17.02 | 0 | 0 | 3 | 2 |
Valiant | 18.1 | 6 | 225.0 | 105 | 2.76 | 3.460 | 20.22 | 1 | 0 | 3 | 1 |
Duster 360 | 14.3 | 8 | 360.0 | 245 | 3.21 | 3.570 | 15.84 | 0 | 0 | 3 | 4 |
Merc 240D | 24.4 | 4 | 146.7 | 62 | 3.69 | 3.190 | 20.00 | 1 | 0 | 4 | 2 |
Merc 230 | 22.8 | 4 | 140.8 | 95 | 3.92 | 3.150 | 22.90 | 1 | 0 | 4 | 2 |
Merc 280 | 19.2 | 6 | 167.6 | 123 | 3.92 | 3.440 | 18.30 | 1 | 0 | 4 | 4 |
Merc 280C | 17.8 | 6 | 167.6 | 123 | 3.92 | 3.440 | 18.90 | 1 | 0 | 4 | 4 |
Merc 450SE | 16.4 | 8 | 275.8 | 180 | 3.07 | 4.070 | 17.40 | 0 | 0 | 3 | 3 |
Merc 450SL | 17.3 | 8 | 275.8 | 180 | 3.07 | 3.730 | 17.60 | 0 | 0 | 3 | 3 |
Merc 450SLC | 15.2 | 8 | 275.8 | 180 | 3.07 | 3.780 | 18.00 | 0 | 0 | 3 | 3 |
Cadillac Fleetwood | 10.4 | 8 | 472.0 | 205 | 2.93 | 5.250 | 17.98 | 0 | 0 | 3 | 4 |
Lincoln Continental | 10.4 | 8 | 460.0 | 215 | 3.00 | 5.424 | 17.82 | 0 | 0 | 3 | 4 |
Chrysler Imperial | 14.7 | 8 | 440.0 | 230 | 3.23 | 5.345 | 17.42 | 0 | 0 | 3 | 4 |
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 |
Toyota Corolla | 33.9 | 4 | 71.1 | 65 | 4.22 | 1.835 | 19.90 | 1 | 1 | 4 | 1 |
2.3 Vectores y listas (1).
Dado la siguiente pareja de vectores mu y nu, realizar una función que haga lo siguiente:
- Vaya cogiendo los elementos de mu y nu que estén en la misma posición y los reuna en vectores.
- Todas las parejas se reunirán en una lista y ésta es la salida de la función.
mu <- c(1,2,3)
nu <- c(4,5,6)
iset <- function(mu,nu){
mi.iset <- mapply(c, as.list(mu), as.list(nu), SIMPLIFY=FALSE)
# El SIMPLIFY=FALSE te muestra directamente la matriz por columnas,
# si el valor es TRUE te muestra la matriz aplanada.
return(mi.iset)
}#end function
res <- iset(mu,nu)
res
## [[1]]
## [1] 1 4
##
## [[2]]
## [1] 2 5
##
## [[3]]
## [1] 3 6
2.4 Vectores y listas (2).
Implementa una función que reciba una matriz y devuelva la diagonal de la matriz D, la submatriz inferior debajo de la diagonal R y la la submatriz superior encima de la diagonal R.
divido.matriz <- function(M){
return(list(D=diag(M), R=M[upper.tri(M)], L=M[lower.tri(M)]))
}# fin funcion
m <- matrix(1:9, nrow = 3)
m
## [,1] [,2] [,3]
## [1,] 1 4 7
## [2,] 2 5 8
## [3,] 3 6 9
## $D
## [1] 1 5 9
##
## $R
## [1] 4 7 8
##
## $L
## [1] 2 3 6