Documento 2 Practica Data Frames y Funciones

Cargamos el paquete necesario para la visualización de tablas:

library(formattable)
library(DT)

2.1 Manipulación de Data Frames.

  • Importar el dataset HairEyeColor.
color <- data("HairEyeColor")
  • Si el dataset importado no es un dataframe, convertirlo.
is.data.frame(color)
## [1] FALSE
class(color)
## [1] "character"

Entonces, lo convertimos:

color <- as.data.frame(HairEyeColor)
is.data.frame(color)
## [1] TRUE
  • Analizar la estructura del dataset, tipo de datos, estructura, clase, etc.
class(color)
## [1] "data.frame"
str(color)
## '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 ...
summary(color)
##     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.
nrow(color)
## [1] 32
ncol(color)
## [1] 4

También podríamos haber usado dim(color).

  • Guardar en un vector el nombre de las columnas.
nombres <- names(color)
nombres
## [1] "Hair" "Eye"  "Sex"  "Freq"
  • Cambiar el nombre de la primera columna.
names(color)[1] <-"Pelo"
names(color)
## [1] "Pelo" "Eye"  "Sex"  "Freq"
  • Averiguar el tipo de datos de la primera columna.
class(color[ , 1])
## [1] "factor"
  • Comando para averiguar si hay valores NA en todo el dataframe, y lo mismo en la columna 1.
as.logical(sum(is.na(color)))
## [1] FALSE
as.logical(sum(is.na(color[ , 1])))
## [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.

#formattable(color[c(1,2,3,20), c(2,3)])
color[c(1,2,3,20), c(2,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.
d1 <- color[1:5, ]
formattable(d1)
Pelo Eye Sex Freq
Black Brown Male 32
Brown Brown Male 53
Red Brown Male 10
Blond Brown Male 3
Black Blue Male 11
d2 <- color[(nrow(color)-4) : nrow(color), ]

formattable(d2)
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
d3 <- rbind(d1, d2)
formattable(d3)
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.
nombres[2]
## [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.

unique(d) # Salida como dataframe
##    Pelo
## 1 Black
## 2 Brown
## 3   Red
## 4 Blond
unique(d_) # Salida como factor
## [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.

table(d)
## d
## Black Brown   Red Blond 
##     8     8     8     8
#table(d_) Misma salida
  • 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.

d2 <- color[][4]
datatable(d2)
# 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
# colMeans realiza la media de todos los elementos de cada columna.
colMeans(d2)
## 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
# De la misma forma, rowMeans realiza la media de todos los elementos de cada fila.
rowMeans(df1)
##      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.

  1. library(datasets)
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()’.

  1. data(“mtcars”)
data("mtcars")

Cargamos el paquete mtcars.

  1. mtcars[mtcars$cyl = 4, ]

Arreglamos el fallo cambiando ‘=’ por ‘==’, ya que estamos aplicando una operación lógica de igualdad, no asignando valores.

formattable(mtcars[mtcars$cyl == 4, ])
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
  1. 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).

formattable(mtcars[1:4, ])
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
  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:

formattable(mtcars[mtcars$cyl <= 5, ] )
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
  1. 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.

formattable(mtcars[mtcars$cyl == 4 | mtcars$cyl == 6, ])
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
  1. mtcars[1:20]

Solucionamos el problema de la misma manera que 5), seleccionando el número de columnas.

formattable(mtcars[1:20, ] )
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
res <- divido.matriz(m)
res
## $D
## [1] 1 5 9
## 
## $R
## [1] 4 7 8
## 
## $L
## [1] 2 3 6