2  Tipos y estructuras de datos

Esta práctica contiene ejercicios que muestran cómo trabajar con los tipos y estructuras de datos en R. En concreto, las estructuras de datos que se utilizan son

2.1 Ejercicios Resueltos

Para la realización de esta práctica se requieren los siguientes paquetes.

library(tidyverse) 
# Incluye los siguientes paquetes:
# - readr: para la lectura de ficheros csv. 
# - dplyr: para el preprocesamiento y manipulación de datos.

Ejercicio 2.1 Realizar las siguientes operaciones con vectores.

  1. Crear un vector con los números del 1 al 10.

    La función c() permite combinar elementos en un vector. Los elementos se introducen separados por comas.

    numeros <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
    numeros
     [1]  1  2  3  4  5  6  7  8  9 10

    El operador inicio:fin permite crear un vector con la secuencia de números enteros desde el número inicio hasta el número fin.

    numeros <- 1:10
    numeros
     [1]  1  2  3  4  5  6  7  8  9 10
  2. Mostrar el número de elementos del vector anterior.

    length(numeros)
    [1] 10
  3. Crear un vector con los números pares del 1 al 10.

    pares <- c(2, 4, 6, 8, 10)
    pares
    [1]  2  4  6  8 10

    La función seq(inicio, fin, salto) permite crear un vector con la secuencia de números enteros desde el número inicio hasta el número fin con un salto de salto.

    pares <- seq(2, 10, by = 2)
    pares
    [1]  2  4  6  8 10
  4. Crear un vector con el cuadrado de los elementos del vector anterior.

    El operador ^ permite elevar un número a otro. Cuando se aplica a un vector, eleva cada elemento del vector al número indicado.

    cuadrados <- pares^2
    cuadrados
    [1]   4  16  36  64 100
  5. Crear un vector con 5 números aleatorios entre 1 y 10.

    La función sample(vector, n) permite seleccionar n elementos aleatorios de vector. El muestreo es sin reemplazamiento.

    aleatorios <- sample(1:10, 5)
    aleatorios
    [1] 1 7 8 3 2
  6. Crear un vector booleano con los números del vector anterior que son pares.

    El operador %% permite calcular el resto de la división entera de dos números. Si el resto es 0, el número es par. Y el operador == permite comparar dos vectores elemento a elemento.

    par <- aleatorios %% 2 == 0
    par
    [1] FALSE FALSE  TRUE FALSE  TRUE
  7. Crear un vector con 100 números aleatorios entre 0 y 1.

    La función runif(n, min, max) permite generar n números aleatorios entre min y max.

    aleatorios2 <- runif(100, 0, 1)
    aleatorios2
      [1] 0.499878718 0.544018542 0.886148995 0.543899208 0.801641356 0.435624898
      [7] 0.967269188 0.756100157 0.979643439 0.899229483 0.705774663 0.845708399
     [13] 0.105617115 0.518971112 0.745231331 0.797202368 0.037812405 0.916450974
     [19] 0.144043338 0.821696341 0.234444364 0.780355930 0.344066232 0.348582926
     [25] 0.555565733 0.915515226 0.934052550 0.115558588 0.093445612 0.884562579
     [31] 0.996128245 0.966637026 0.485136285 0.268983750 0.065136166 0.027485185
     [37] 0.851198265 0.085447523 0.077409238 0.639923463 0.259450450 0.161598361
     [43] 0.852864587 0.502194726 0.426578752 0.923690302 0.879763226 0.690117263
     [49] 0.969394516 0.123612320 0.367289848 0.735709370 0.823511425 0.957493439
     [55] 0.707588117 0.162481450 0.816290779 0.987334910 0.768818590 0.770294666
     [61] 0.992456676 0.764479936 0.422911661 0.268110450 0.244754591 0.871788305
     [67] 0.055971608 0.502644310 0.765029881 0.970006873 0.108239491 0.203647202
     [73] 0.470747566 0.289068480 0.778326256 0.632798350 0.681428747 0.272469395
     [79] 0.368209220 0.506342604 0.998503710 0.071021057 0.465551301 0.770192195
     [85] 0.692948590 0.823849312 0.731020522 0.620990727 0.173419988 0.354330793
     [91] 0.814167431 0.913717844 0.116922751 0.446172137 0.249115813 0.286621938
     [97] 0.440265705 0.104926768 0.213243857 0.007217677
  8. Ordenar el vector anterior de menor a mayor.

    La función sort(vector) permite ordenar los elementos de un vector de menor a mayor.

    sort(aleatorios2)
      [1] 0.007217677 0.027485185 0.037812405 0.055971608 0.065136166 0.071021057
      [7] 0.077409238 0.085447523 0.093445612 0.104926768 0.105617115 0.108239491
     [13] 0.115558588 0.116922751 0.123612320 0.144043338 0.161598361 0.162481450
     [19] 0.173419988 0.203647202 0.213243857 0.234444364 0.244754591 0.249115813
     [25] 0.259450450 0.268110450 0.268983750 0.272469395 0.286621938 0.289068480
     [31] 0.344066232 0.348582926 0.354330793 0.367289848 0.368209220 0.422911661
     [37] 0.426578752 0.435624898 0.440265705 0.446172137 0.465551301 0.470747566
     [43] 0.485136285 0.499878718 0.502194726 0.502644310 0.506342604 0.518971112
     [49] 0.543899208 0.544018542 0.555565733 0.620990727 0.632798350 0.639923463
     [55] 0.681428747 0.690117263 0.692948590 0.705774663 0.707588117 0.731020522
     [61] 0.735709370 0.745231331 0.756100157 0.764479936 0.765029881 0.768818590
     [67] 0.770192195 0.770294666 0.778326256 0.780355930 0.797202368 0.801641356
     [73] 0.814167431 0.816290779 0.821696341 0.823511425 0.823849312 0.845708399
     [79] 0.851198265 0.852864587 0.871788305 0.879763226 0.884562579 0.886148995
     [85] 0.899229483 0.913717844 0.915515226 0.916450974 0.923690302 0.934052550
     [91] 0.957493439 0.966637026 0.967269188 0.969394516 0.970006873 0.979643439
     [97] 0.987334910 0.992456676 0.996128245 0.998503710
  9. Ordenar el vector anterior de mayor a menor.

    La función sort(vector, decreasing = TRUE) permite ordenar los elementos de un vector de mayor a menor.

    sort(aleatorios2, decreasing = TRUE)
      [1] 0.998503710 0.996128245 0.992456676 0.987334910 0.979643439 0.970006873
      [7] 0.969394516 0.967269188 0.966637026 0.957493439 0.934052550 0.923690302
     [13] 0.916450974 0.915515226 0.913717844 0.899229483 0.886148995 0.884562579
     [19] 0.879763226 0.871788305 0.852864587 0.851198265 0.845708399 0.823849312
     [25] 0.823511425 0.821696341 0.816290779 0.814167431 0.801641356 0.797202368
     [31] 0.780355930 0.778326256 0.770294666 0.770192195 0.768818590 0.765029881
     [37] 0.764479936 0.756100157 0.745231331 0.735709370 0.731020522 0.707588117
     [43] 0.705774663 0.692948590 0.690117263 0.681428747 0.639923463 0.632798350
     [49] 0.620990727 0.555565733 0.544018542 0.543899208 0.518971112 0.506342604
     [55] 0.502644310 0.502194726 0.499878718 0.485136285 0.470747566 0.465551301
     [61] 0.446172137 0.440265705 0.435624898 0.426578752 0.422911661 0.368209220
     [67] 0.367289848 0.354330793 0.348582926 0.344066232 0.289068480 0.286621938
     [73] 0.272469395 0.268983750 0.268110450 0.259450450 0.249115813 0.244754591
     [79] 0.234444364 0.213243857 0.203647202 0.173419988 0.162481450 0.161598361
     [85] 0.144043338 0.123612320 0.116922751 0.115558588 0.108239491 0.105617115
     [91] 0.104926768 0.093445612 0.085447523 0.077409238 0.071021057 0.065136166
     [97] 0.055971608 0.037812405 0.027485185 0.007217677
  10. Crear un vector con los días laborables de la semana.

    dias_laborables <- c("Lunes", "Martes", "Miércoles", "Jueves", "Viernes")
    dias_laborables
    [1] "Lunes"     "Martes"    "Miércoles" "Jueves"    "Viernes"  
  11. Añadir los días del fin de semana al vector anterior y guardar el resultado en una nueva variable.

    dias <- c(dias_laborables, "Sábado", "Domingo")
    dias
    [1] "Lunes"     "Martes"    "Miércoles" "Jueves"    "Viernes"   "Sábado"   
    [7] "Domingo"  
  12. Acceder al tercer elemento del vector.

    dias_laborables[3]
    [1] "Miércoles"
  13. Seleccionar los días pares del vector.

    dias[c(2, 4, 6)]
    [1] "Martes" "Jueves" "Sábado"
    dias[-c(1, 3, 5, 7)]
    [1] "Martes" "Jueves" "Sábado"
    dias[c(FALSE, TRUE)]
    [1] "Martes" "Jueves" "Sábado"
  14. Concatenar los elementos del vector en una cadena de texto.

    La función paste(vector, collapse = " ") permite concatenar los elementos de un vector en una cadena de texto separados por un espacio.

    paste(dias, collapse = " ")
    [1] "Lunes Martes Miércoles Jueves Viernes Sábado Domingo"
  15. Concatenar los elementos del vector en una cadena de texto separados por comas.

    semana <- paste(dias, collapse = ", ")
    semana
    [1] "Lunes, Martes, Miércoles, Jueves, Viernes, Sábado, Domingo"
  16. Dividir la cadena anterior en subcadenas usando como separador la coma.

    La función strsplit(cadena, separador) permite dividir una cadena de texto en subcadenas usando como separador el valor de separador.

    strsplit(semana, ", ")
    [[1]]
    [1] "Lunes"     "Martes"    "Miércoles" "Jueves"    "Viernes"   "Sábado"   
    [7] "Domingo"  

Ejercicio 2.2 Se ha tomado una muestra de alumnos de una clase y se ha recogido la información sobre el sexo de los alumnos obteniendo los siguientes datos:

Mujer, Hombre, Mujer, Hombre, Mujer, Mujer, Hombre, Hombre

  1. Crear un vector con los datos de la muestra.

    sexo <- c("Mujer", "Hombre", "Mujer", "Hombre", "Mujer", "Mujer", "Hombre", "Hombre")
    sexo
    [1] "Mujer"  "Hombre" "Mujer"  "Hombre" "Mujer"  "Mujer"  "Hombre" "Hombre"
  2. Convertir el vector anterior en un factor.

    La función factor(vector, labels) permite convertir vector en un factor con los niveles o categorías especificados en labels. Si no se indica labels, los niveles se toman de los elementos del vector y se ordenan alfabéticamente.

    sexo <- factor(sexo)
    sexo
    [1] Mujer  Hombre Mujer  Hombre Mujer  Mujer  Hombre Hombre
    Levels: Hombre Mujer
  3. Mostrar los niveles del factor.

    La función levels(factor) permite mostrar los niveles del factor factor.

    levels(sexo)
    [1] "Hombre" "Mujer" 
  4. Reordenar los niveles del factor para que la categoría “Mujer” sea la primera.

    sexo <- factor(sexo, levels = c("Mujer", "Hombre"))
    sexo
    [1] Mujer  Hombre Mujer  Hombre Mujer  Mujer  Hombre Hombre
    Levels: Mujer Hombre

Ejercicio 2.3 Realizar las siguientes operaciones con matrices.

  1. Crear una matriz de 2 filas y 2 columnas con los números del 1 al 4.

    La función matrix(vector, nrow, ncol) permite crear una matriz con los datos de vector el número de filas indicado en nrow y el número de columnas indicado en ncol.

    A <- matrix(1:4, nrow = 2, ncol = 2)
    A
         [,1] [,2]
    [1,]    1    3
    [2,]    2    4
  2. Añadir a la matriz anterior una nueva columna con los números del 5 y 6.

    La función cbind(matriz, vector) permite añadir una nueva columna a la matriz matriz con los datos de vector.

    A <- cbind(A, 5:6)
    A
         [,1] [,2] [,3]
    [1,]    1    3    5
    [2,]    2    4    6
  3. Crear una matriz de 2 filas y 2 columnas con los números del 1 al 4, rellenando los elementos por filas.

    La función matrix rellena los elementos de la matriz por columnas. Para rellenar los elementos por filas, se puede utilizar el parámetro opcional byrow = TRUE.

    B <- matrix(1:4, nrow = 2, ncol = 2, byrow = TRUE)
    B
         [,1] [,2]
    [1,]    1    2
    [2,]    3    4
  4. Crear otra matriz a partir de la anterior añadiendo una fila con los números 5 y 6.

    B <- rbind(B, 5:6)
    B
         [,1] [,2]
    [1,]    1    2
    [2,]    3    4
    [3,]    5    6
  5. Acceder al elemento de la segunda fila y la primera columna de la matriz anterior.

    B[2, 1]
    [1] 3
  6. Seleccionar la primera fila de la matriz.

    B[1, ]
    [1] 1 2
  7. Seleccionar la segunda columna de la matriz.

    B[, 2]
    [1] 2 4 6
  8. Multiplicar la matriz A por la matriz B.

    La multiplicación de matrices se realiza con el operador %*%.

    A %*% B
         [,1] [,2]
    [1,]   35   44
    [2,]   44   56
  9. Calcular la transpuesta de la matriz A.

    La función t(matriz) permite calcular la transpuesta de matriz.

    t(A)
         [,1] [,2]
    [1,]    1    2
    [2,]    3    4
    [3,]    5    6

Ejercicio 2.4 Realizar las siguientes operaciones con listas.

  1. Crear una lista con los siguientes con los datos del siguiente alumno:

    • Nombre: Juan.
    • Edad: 20 años.

    Para crear una lista se utiliza la función list(nombre1 = valor1, nombre2 = valor2, ...).

    alumno <- list(Nombre = "Juan", Edad = 20)
    alumno
    $Nombre
    [1] "Juan"
    
    $Edad
    [1] 20
  2. Obtener la edad del alumno.

    Para acceder a los elementos de una lista se utiliza el operador $.

    alumno$Edad
    [1] 20
  3. Crear una lista con las siguientes notas del alumno:

    • Matemáticas: 7.
    • Química: 8.
    notas <- list(Matemáticas = 7, Química = 8)
    notas
    $Matemáticas
    [1] 7
    
    $Química
    [1] 8
  4. Añadir la lista de notas a la lista del alumno.

    alumno$Notas <- notas
    alumno
    $Nombre
    [1] "Juan"
    
    $Edad
    [1] 20
    
    $Notas
    $Notas$Matemáticas
    [1] 7
    
    $Notas$Química
    [1] 8
  5. Añadir a la lista anterior la nota del examen de Física, que ha sido un 6.

    alumno$Notas$Física <- 6
    alumno
    $Nombre
    [1] "Juan"
    
    $Edad
    [1] 20
    
    $Notas
    $Notas$Matemáticas
    [1] 7
    
    $Notas$Química
    [1] 8
    
    $Notas$Física
    [1] 6

Ejercicio 2.5 La siguiente tabla contiene los ingresos y gastos de una empresa durante el primer trimestre del año.

Mes Ingresos Gastos Impuestos
Enero 45000 33400 6450
Febrero 41500 35400 6300
Marzo 51200 35600 7100
  1. Crear un data frame con los datos de la tabla.

    Para crear un data frame se utiliza la función data.frame(columna1 = vector1, columna2 = vector2, ...), donde columna1, columna2, … son los nombres de las columnas y vector1, vector2, … son los vectores con los datos de cada columna, que deben tener la misma longitud.

    df <- data.frame(
        Mes = c("Enero", "Febrero", "Marzo"),
        Ingresos = c(45000, 41500, 51200),
        Gastos = c(33400, 35400, 35600)
        )
    df 
          Mes Ingresos Gastos
    1   Enero    45000  33400
    2 Febrero    41500  35400
    3   Marzo    51200  35600
  2. Añadir una nueva columna con los siguientes impuestos pagados.

    Mes Impuestos
    Enero 6450
    Febrero 6300
    Marzo 7100

    Con las funciones del paquete base de R.

    df$Impuestos <- c(6450, 6300, 7100)
    df
          Mes Ingresos Gastos Impuestos
    1   Enero    45000  33400      6450
    2 Febrero    41500  35400      6300
    3   Marzo    51200  35600      7100

    Con las funciones del paquete dplyr de tidyverse.

    df <- df |> mutate(Impuestos = c(6450, 6300, 7100))
    df
          Mes Ingresos Gastos Impuestos
    1   Enero    45000  33400      6450
    2 Febrero    41500  35400      6300
    3   Marzo    51200  35600      7100
  3. Añadir una nueva fila con los siguientes datos de Abril.

    Mes Ingresos Gastos Impuestos
    Abril 49700 36300 6850

    Con las funciones del paquete base de R.

    df <- rbind(df, list(Mes = "Abril", Ingresos = 49700, Gastos = 36300, Impuestos = 6850))
    df
          Mes Ingresos Gastos Impuestos
    1   Enero    45000  33400      6450
    2 Febrero    41500  35400      6300
    3   Marzo    51200  35600      7100
    4   Abril    49700  36300      6850

    Con las funciones del paquete dplyr de tidyverse.

    df <- df |> add_row(Mes = "Abril", Ingresos = 49700, Gastos = 36300, Impuestos = 6850)
    df
          Mes Ingresos Gastos Impuestos
    1   Enero    45000  33400      6450
    2 Febrero    41500  35400      6300
    3   Marzo    51200  35600      7100
    4   Abril    49700  36300      6850
  4. Cambiar los ingresos de Marzo por 50400.

    df[3, "Ingresos"] <- 50400
    df
          Mes Ingresos Gastos Impuestos
    1   Enero    45000  33400      6450
    2 Febrero    41500  35400      6300
    3   Marzo    50400  35600      7100
    4   Abril    49700  36300      6850
  5. Guardar el data frame en un fichero csv.

    La función write.csv(dataframe, "fichero.csv") permite guardar el data frame dataframe en el fichero fichero.csv.

    write.csv(df, "datos/ingresos_gastos.csv", row.names = FALSE)

Ejercicio 2.6 El fichero colesterol.csv contiene información de una muestra de pacientes donde se han medido la edad, el sexo, el peso, la altura y el nivel de colesterol, además de su nombre.

  1. Crear un data frame con los datos de todos los pacientes del estudio a partir del fichero colesterol.csv y mostrar las primeras filas.

    Con las funciones del paquete base de R. La función read.csv("fichero.csv") permite leer un fichero csv y cargar los datos en un data frame. Y la función head(dataframe) permite mostrar las primeras filas del data frame dataframe.

    df <- read.csv("https://aprendeconalf.es/estadistica-practicas-r/datos/colesterol.csv")
    head(df)
                            nombre edad sexo peso altura colesterol
    1 José Luis Martínez Izquierdo   18    H   85   1.79        182
    2               Rosa Díaz Díaz   32    M   65   1.73        232
    3        Javier García Sánchez   24    H   NA   1.81        191
    4          Carmen López Pinzón   35    M   65   1.70        200
    5         Marisa López Collado   46    M   51   1.58        148
    6            Antonio Ruiz Cruz   68    H   66   1.74        249

    Con la función read_csv del paquete del paquete readr de tidyverse.

    df <- read_csv("https://aprendeconalf.es/estadistica-practicas-r/datos/colesterol.csv")
    Rows: 14 Columns: 6
    ── Column specification ────────────────────────────────────────────────────────
    Delimiter: ","
    chr (2): nombre, sexo
    dbl (4): edad, peso, altura, colesterol
    
    ℹ Use `spec()` to retrieve the full column specification for this data.
    ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
    head(df)
    # A tibble: 6 × 6
      nombre                        edad sexo   peso altura colesterol
      <chr>                        <dbl> <chr> <dbl>  <dbl>      <dbl>
    1 José Luis Martínez Izquierdo    18 H        85   1.79        182
    2 Rosa Díaz Díaz                  32 M        65   1.73        232
    3 Javier García Sánchez           24 H        NA   1.81        191
    4 Carmen López Pinzón             35 M        65   1.7         200
    5 Marisa López Collado            46 M        51   1.58        148
    6 Antonio Ruiz Cruz               68 H        66   1.74        249
  2. Mostrar las variables del data frame.

    Con las funciones del paquete base de R.

    [1] "nombre"     "edad"       "sexo"       "peso"       "altura"    
    [6] "colesterol"

    Con la función glimpse del paquete dplyr de tidyverse. Esta función muestra las columnas del data frame en filas, de manera que permite ver todas las columnas de un data frame cuando este tiene muchas columnas.

    Rows: 14
    Columns: 6
    $ nombre     <chr> "José Luis Martínez Izquierdo", "Rosa Díaz Díaz", "Javier G…
    $ edad       <dbl> 18, 32, 24, 35, 46, 68, 51, 22, 35, 46, 53, 58, 27, 20
    $ sexo       <chr> "H", "M", "H", "M", "M", "H", "H", "M", "H", "H", "M", "H",…
    $ peso       <dbl> 85, 65, NA, 65, 51, 66, 62, 60, 90, 75, 55, 78, 109, 61
    $ altura     <dbl> 1.79, 1.73, 1.81, 1.70, 1.58, 1.74, 1.72, 1.66, 1.94, 1.85,…
    $ colesterol <dbl> 182, 232, 191, 200, 148, 249, 276, NA, 241, 280, 262, 198, …
  3. Mostrar el número de filas del data frame, que corresponde al número de pacientes.

    La función nrow(dataframe) permite mostrar el número de filas del data frame dataframe.

    nrow(df)
    [1] 14
  4. Mostrar 5 filas aleatorias del data frame.

    La función sample(vector, n) permite seleccionar n elementos aleatorios de vector. El muestreo es sin reemplazamiento.

    df[sample(nrow(df), 5), ]
    # A tibble: 5 × 6
      nombre                        edad sexo   peso altura colesterol
      <chr>                        <dbl> <chr> <dbl>  <dbl>      <dbl>
    1 Javier García Sánchez           24 H        NA   1.81        191
    2 José Luis Martínez Izquierdo    18 H        85   1.79        182
    3 Antonio Ruiz Cruz               68 H        66   1.74        249
    4 Macarena Álvarez Luna           53 M        55   1.62        262
    5 Antonio Fernández Ocaña         51 H        62   1.72        276

    La función sample_n(dataframe, n) del paquete dplyr de tidyverse permite seleccionar n filas aleatorias del data frame dataframe.

    df |> sample_n(5)
    # A tibble: 5 × 6
      nombre                 edad sexo   peso altura colesterol
      <chr>                 <dbl> <chr> <dbl>  <dbl>      <dbl>
    1 Rosa Díaz Díaz           32 M        65   1.73        232
    2 Carolina Rubio Moreno    20 M        61   1.77        194
    3 Macarena Álvarez Luna    53 M        55   1.62        262
    4 Marisa López Collado     46 M        51   1.58        148
    5 Antonio Ruiz Cruz        68 H        66   1.74        249
  5. Obtener los datos de colesterol de los pacientes.

    Con las funciones del paquete base de R.

    df$colesterol
     [1] 182 232 191 200 148 249 276  NA 241 280 262 198 210 194

    Con la función select del paquete dplyr de tidyverse.

    df |> select(colesterol)
    # A tibble: 14 × 1
       colesterol
            <dbl>
     1        182
     2        232
     3        191
     4        200
     5        148
     6        249
     7        276
     8         NA
     9        241
    10        280
    11        262
    12        198
    13        210
    14        194
  6. Obtener los datos del quinto paciente.

    Con las funciones del paquete base de R.

    df[5, ]
    # A tibble: 1 × 6
      nombre                edad sexo   peso altura colesterol
      <chr>                <dbl> <chr> <dbl>  <dbl>      <dbl>
    1 Marisa López Collado    46 M        51   1.58        148

    Con la función slice del paquete dplyr de tidyverse.

    df |> slice(5)
    # A tibble: 1 × 6
      nombre                edad sexo   peso altura colesterol
      <chr>                <dbl> <chr> <dbl>  <dbl>      <dbl>
    1 Marisa López Collado    46 M        51   1.58        148

2.2 Ejercicios Propuestos

Ejercicio 2.7 La siguiente tabla contiene las notas de un grupo de alumnos en dos asignaturas.

Alumno Grupo Física Química
Juan A 7.0 6.7
María B 3.5 5.0
Pedro B 6.0 7.1
Ana A 5.2 4.5
Luis A 4.5 NA
Sara B 9.0 9.2
  1. Crear un vector con los nombres de los alumnos.

  2. Crear un factor el grupo.

  3. Crear un vector con las notas de Física y otro con las notas de Química.

  4. Crear un vector con la nota media de las dos asignaturas.

  5. Crear un vector booleano con los alumnos que han aprobado el curso. Para aprobar el curso, la nota media de las dos asignaturas debe ser mayor o igual a 5.

  6. Crear un vector con los nombres de los alumnos que han aprobado el curso.

  7. Crear un data frame con los nombres de los alumnos, sus notas y su media reutilizando los vectores anteriores.

  8. Guardar el data frame en un fichero csv.