EJERCICIO 1

Para el ejercicio 1, utilizaremos los datos los datos millas que hay el package datos. Estos datos consisten en 238 filas y 11 columnas que describen el consumo de combustible de 38 modelos de coche populares.

Puedes consultar más sobre los datos en la ayuda: ?millas.

library(datos)
## Warning: package 'datos' was built under R version 4.2.3
suppressPackageStartupMessages(library(tidyverse))
?millas

EJERCICIO 1.1.

A partir de los datos de millas, dibuja un gráfico de dispersión de puntos que muestre las millas recorridas en autopista por galón de combustible consumido (autopista) respecto a la cilindrada del motor de cada automóvil. No olvides añadir títulos al gráfico y a los ejes x e y.

# Solución:

library(ggplot2)

ggplot(millas, aes(autopista, cilindrada)) +
  geom_point() + xlab("Autopista(nº de millas))") +
  ylab("Cilindrada del motor")+ggtitle("Gráfico de dispersión")

EJERCICIO 1.2.

A partir del gráfico del ejercicio 1.1., escoge una columna para cada uno de los siguientes parámetros estéticos: color, size y shape.

Truco: Observa que puedes seleccionar tanto columnas numéricas como de tipo carácter o factor. Si lo crees interesante, puedes utilizar la misma columna para distintos parámetros del gráfico .

Comenta algún aspecto relevante que hayas descubierto sobre los coches a partir del gráfico.

# Solución:

ggplot(data = millas, aes(x = autopista, y = cilindrada, color = combustible, size = cilindros, shape = traccion)) +
  geom_point() +
  scale_x_log10() +
  #mejor consistencia que xlab() o ylab()
  labs(x = "Autopista (nº de millas)", y = "Cilindrada del motor", title = "Gráfico de dispersión de puntos") +
  theme_minimal()

Considerando tanto el sistema de tracción como el tipo de combustible, se evidencia que en situaciones donde la tracción es delantera, el vehículo cuenta con 4 cilindros y utiliza combustible diesel, logra superar las 40 millas por galón en carretera.

A su vez, se observa una correlacion negativa entre cilindrada y autopista (nº de millas), se puede asumir que un incremento en cilindrada supone menos millas por galón de combustible consumido.

EJERCICIO 1.3.

Transforma el siguiente vector de tipo factor a tipo numeric de forma que el valor final mostrado sea exactamente el mismo en ambos vectores, pero con formato distinto. Para ello utiliza as.character() y as.numeric().

¿Qué sucede si sólo utilizas as.numeric() directamente sobre la columna factor?

vec <- factor(c("8","5","9","8","1","7"))
print(vec) # valor mostrado
## [1] 8 5 9 8 1 7
## Levels: 1 5 7 8 9
# Solución:
vec_numeric <- as.numeric(as.character(vec))
class(vec)
## [1] "factor"
class(vec_numeric)
## [1] "numeric"
vec
## [1] 8 5 9 8 1 7
## Levels: 1 5 7 8 9
vec_numeric
## [1] 8 5 9 8 1 7
vec_numeric1<-as.numeric(vec)
vec_numeric1
## [1] 4 2 5 4 1 3

Al aplicar la función as.numeric a un vector de tipo factor (vec), el resultado es un vector numérico. Sin embargo, los valores no coinciden con el vector original debido a que la función asigna valores numéricos a cada nivel del factor según su orden relativo.

EJERCICIO 1.4.

Es millas un objeto de la clase data.frame o matrix?

¿Y el siguiente objeto obj?

obj <- cbind(millas$cilindrada,millas$cilindros)
class(millas)
## [1] "tbl_df"     "tbl"        "data.frame"
class(obj)
## [1] "matrix" "array"

Millas es un objeto de la clase data.frame Matrix es un objeto de la clase matrix

EJERCICIO 1.5.

Crea una función que tome un vector de tipo integer como input y retorne un objeto de tipo lista que contega los siguientes 4 elementos:

  1. El último valor del vector
  2. Los elementos de las posiciones impares.
  3. Todos los elementos excepto el primero.
  4. Solo números impares (y no valores faltantes).
# solución
crear_lista <- function(vector) {
  # 1. El último valor del vector
  ultimo_valor <- tail(vector, n = 1)

  # 2. Los elementos de las posiciones impares
  impares <- vector[seq(1, length(vector), by = 2)]

  # 3. Todos los elementos excepto el primero
  sin_primero <- vector[-1]

  # 4. Solo números impares (y no valores faltantes)
  impares_no_nulos <- vector[vector %% 2 != 0 & !is.na(vector)]

  # Crear la lista con los elementos calculados
  resultado <- list(
    ultimo_valor = ultimo_valor,
    impares = impares,
    sin_primero = sin_primero,
    impares_no_nulos = impares_no_nulos
  )

  return(resultado)
}

# Ejemplo de uso
mi_vector <- c(1,2,3,7,9,12,17,22,15,8,23,33,53)
crear_lista(mi_vector)
## $ultimo_valor
## [1] 53
## 
## $impares
## [1]  1  3  9 17 15 23 53
## 
## $sin_primero
##  [1]  2  3  7  9 12 17 22 15  8 23 33 53
## 
## $impares_no_nulos
## [1]  1  3  7  9 17 15 23 33 53

EJERCICIO 1.6.

Busca un ejemplo de objeto x en el que la expresión x[-which(x > 0)] no devuelve el mismo resultado que x[x <= 0]

# Solución:

x <- c(-1,-2,-5, -10)

x[-which(x > 0)]
## numeric(0)
x[x <= 0]
## [1]  -1  -2  -5 -10

EJERCICIO 1.7.

Añade a millas una nueva columna llamada “fabr_mod” que contenga la concatenación del nombre del fabricante, un guion “-” y el modelo del coche. Presenta la nueva columna mediante la función head().

# Solución:

millas$fabr_mod<-paste(millas$fabricante,"-", millas$modelo)
head(millas$fabr_mod)
## [1] "audi - a4" "audi - a4" "audi - a4" "audi - a4" "audi - a4" "audi - a4"

EJERCICIO 1.8.

Selecciona todos los coches de millas que cumplan con todas todas las condiciones siguientes:

  • La marca es distinta a “dodge”
  • Tiene tracción en las cuatro puertas
  • Han estado fabricados antes del 2008
  • Las millas/galón, o bién en ciudad, o bién en carretera, no llegan a 12 millas/galón.

¿Cuantos coches has encontrado?

# Solución:

coches <- millas[millas$fabricante!= 'dodge' & millas$traccion=="4" & millas$anio <2008 & 
(millas$ciudad < 12 | millas$autopista <12), ]


# Cuenta cuántos coches has encontrado:
n <- nrow(coches)
print(n)
## [1] 5

Se encontraron 5 coches

EJERCICIO 1.9.

Añade una nueva columna “vol_por_cil” a obj del ejercicio 1.4. que contenga el ratio de la cilindrada sobre el número de cilindros. Presenta el summary de la nueva columna.

# Solución:

millas$cilindros <- as.numeric(millas$cilindros)

obj_vol <- cbind(millas$cilindrada,millas$cilindros,  millas$cilindrada/millas$cilindros)

colnames(obj_vol) <- c("cilindrada", "cilindros", "vol_por_cil")

summary(obj_vol[,3])
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##  0.4000  0.5000  0.5875  0.5780  0.6500  0.8750

EJERCICIO 1.10.

Modifica los valores de la columna “vol_por_cil” del objeto obj del ejercicio 1.9. asignando NA a los valores de esta columna que sean superiores a 0.7.

Presenta los datos con un summary del nuevo objeto obj. ¿Cuántos valores NA se han creado en esta columna?

# Solución:

obj<- as.data.frame(obj_vol)

obj$vol_por_cil[obj$vol_por_cil>0.7] <- NA 
summary(obj$vol_por_cil)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
##  0.4000  0.5000  0.5750  0.5644  0.6250  0.7000      18

Se observan 18 NA’s en la columa ob_por_cil