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
- Vectores.
- Factores.
- Matrices.
- Listas.
- Dataframes.
2.1 Ejercicios Resueltos
Para la realización de esta práctica se requieren los siguientes paquetes.
Ejercicio 2.1 Realizar las siguientes operaciones con vectores.
-
Crear un vector con los números del 1 al 10.
TipSoluciónLa 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 10El operador
inicio:finpermite crear un vector con la secuencia de números enteros desde el númeroiniciohasta el númerofin.numeros <- 1:10 numeros[1] 1 2 3 4 5 6 7 8 9 10 -
Mostrar el número de elementos del vector anterior.
TipSoluciónlength(numeros)[1] 10 -
Crear un vector con los números pares del 1 al 10.
-
Crear un vector con el cuadrado de los elementos del vector anterior.
TipSoluciónEl 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 -
Crear un vector con 5 números aleatorios entre 1 y 10.
TipSoluciónLa función
sample(vector, n)permite seleccionarnelementos aleatorios devector. El muestreo es sin reemplazamiento.aleatorios <- sample(1:10, 5) aleatorios[1] 2 3 8 4 7 -
Crear un vector booleano con los números del vector anterior que son pares.
TipSoluciónEl 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] TRUE FALSE TRUE TRUE FALSE -
Crear un vector con 100 números aleatorios entre 0 y 1.
TipSoluciónLa función
runif(n, min, max)permite generarnnúmeros aleatorios entreminymax.aleatorios2 <- runif(100, 0, 1) aleatorios2[1] 0.27812564 0.02048030 0.95288475 0.03789615 0.09068647 [6] 0.71607835 0.42625092 0.41742506 0.55967182 0.40899211 [11] 0.65750501 0.94825489 0.11885394 0.80688786 0.50054123 [16] 0.62566175 0.65409778 0.54055879 0.73645412 0.62965847 [21] 0.52533208 0.31727814 0.74827675 0.62974126 0.05780496 [26] 0.02948499 0.98578404 0.71641997 0.90964178 0.69742326 [31] 0.36164440 0.55010274 0.41423304 0.26843925 0.97964069 [36] 0.39175954 0.65115507 0.84366508 0.93678735 0.20376955 [41] 0.30456045 0.59438750 0.36994116 0.86274831 0.71213724 [46] 0.69174973 0.92938459 0.61613708 0.32180723 0.22059590 [51] 0.13811753 0.83818611 0.39696736 0.56897473 0.45631636 [56] 0.10557374 0.03465704 0.50361644 0.57586441 0.47230650 [61] 0.37612247 0.66803427 0.66427183 0.70226277 0.48697115 [66] 0.96637442 0.47446504 0.81969409 0.80051308 0.87817111 [71] 0.89509571 0.86197981 0.52819260 0.97111504 0.69269499 [76] 0.10376186 0.29359888 0.67637991 0.66696954 0.17242071 [81] 0.17276092 0.59471285 0.34769122 0.56077168 0.15342637 [86] 0.46766450 0.42075307 0.88696618 0.88569930 0.94735432 [91] 0.17829175 0.74933721 0.90276392 0.55237736 0.58445031 [96] 0.09192486 0.72838241 0.38588608 0.84784073 0.87235358 -
Ordenar el vector anterior de menor a mayor.
TipSoluciónLa función
sort(vector)permite ordenar los elementos de un vector de menor a mayor.sort(aleatorios2)[1] 0.02048030 0.02948499 0.03465704 0.03789615 0.05780496 [6] 0.09068647 0.09192486 0.10376186 0.10557374 0.11885394 [11] 0.13811753 0.15342637 0.17242071 0.17276092 0.17829175 [16] 0.20376955 0.22059590 0.26843925 0.27812564 0.29359888 [21] 0.30456045 0.31727814 0.32180723 0.34769122 0.36164440 [26] 0.36994116 0.37612247 0.38588608 0.39175954 0.39696736 [31] 0.40899211 0.41423304 0.41742506 0.42075307 0.42625092 [36] 0.45631636 0.46766450 0.47230650 0.47446504 0.48697115 [41] 0.50054123 0.50361644 0.52533208 0.52819260 0.54055879 [46] 0.55010274 0.55237736 0.55967182 0.56077168 0.56897473 [51] 0.57586441 0.58445031 0.59438750 0.59471285 0.61613708 [56] 0.62566175 0.62965847 0.62974126 0.65115507 0.65409778 [61] 0.65750501 0.66427183 0.66696954 0.66803427 0.67637991 [66] 0.69174973 0.69269499 0.69742326 0.70226277 0.71213724 [71] 0.71607835 0.71641997 0.72838241 0.73645412 0.74827675 [76] 0.74933721 0.80051308 0.80688786 0.81969409 0.83818611 [81] 0.84366508 0.84784073 0.86197981 0.86274831 0.87235358 [86] 0.87817111 0.88569930 0.88696618 0.89509571 0.90276392 [91] 0.90964178 0.92938459 0.93678735 0.94735432 0.94825489 [96] 0.95288475 0.96637442 0.97111504 0.97964069 0.98578404 -
Ordenar el vector anterior de mayor a menor.
TipSoluciónLa función
sort(vector, decreasing = TRUE)permite ordenar los elementos de un vector de mayor a menor.sort(aleatorios2, decreasing = TRUE)[1] 0.98578404 0.97964069 0.97111504 0.96637442 0.95288475 [6] 0.94825489 0.94735432 0.93678735 0.92938459 0.90964178 [11] 0.90276392 0.89509571 0.88696618 0.88569930 0.87817111 [16] 0.87235358 0.86274831 0.86197981 0.84784073 0.84366508 [21] 0.83818611 0.81969409 0.80688786 0.80051308 0.74933721 [26] 0.74827675 0.73645412 0.72838241 0.71641997 0.71607835 [31] 0.71213724 0.70226277 0.69742326 0.69269499 0.69174973 [36] 0.67637991 0.66803427 0.66696954 0.66427183 0.65750501 [41] 0.65409778 0.65115507 0.62974126 0.62965847 0.62566175 [46] 0.61613708 0.59471285 0.59438750 0.58445031 0.57586441 [51] 0.56897473 0.56077168 0.55967182 0.55237736 0.55010274 [56] 0.54055879 0.52819260 0.52533208 0.50361644 0.50054123 [61] 0.48697115 0.47446504 0.47230650 0.46766450 0.45631636 [66] 0.42625092 0.42075307 0.41742506 0.41423304 0.40899211 [71] 0.39696736 0.39175954 0.38588608 0.37612247 0.36994116 [76] 0.36164440 0.34769122 0.32180723 0.31727814 0.30456045 [81] 0.29359888 0.27812564 0.26843925 0.22059590 0.20376955 [86] 0.17829175 0.17276092 0.17242071 0.15342637 0.13811753 [91] 0.11885394 0.10557374 0.10376186 0.09192486 0.09068647 [96] 0.05780496 0.03789615 0.03465704 0.02948499 0.02048030 -
Crear un vector con los días laborables de la semana.
TipSolucióndias_laborables <- c("Lunes", "Martes", "Miércoles", "Jueves", "Viernes") dias_laborables[1] "Lunes" "Martes" "Miércoles" "Jueves" "Viernes" -
Añadir los días del fin de semana al vector anterior y guardar el resultado en una nueva variable.
TipSolucióndias <- c(dias_laborables, "Sábado", "Domingo") dias[1] "Lunes" "Martes" "Miércoles" "Jueves" "Viernes" [6] "Sábado" "Domingo" -
Acceder al tercer elemento del vector.
TipSolucióndias_laborables[3][1] "Miércoles" -
Seleccionar los días pares del vector.
-
Concatenar los elementos del vector en una cadena de texto.
TipSoluciónLa 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" -
Concatenar los elementos del vector en una cadena de texto separados por comas.
TipSoluciónsemana <- paste(dias, collapse = ", ") semana[1] "Lunes, Martes, Miércoles, Jueves, Viernes, Sábado, Domingo" -
Dividir la cadena anterior en subcadenas usando como separador la coma.
TipSoluciónLa función
strsplit(cadena, separador)permite dividir una cadena de texto en subcadenas usando como separador el valor deseparador.strsplit(semana, ", ")[[1]] [1] "Lunes" "Martes" "Miércoles" "Jueves" "Viernes" [6] "Sábado" "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 |
-
Crear un vector con los datos de la muestra.
TipSoluciónsexo <- c("Mujer", "Hombre", "Mujer", "Hombre", "Mujer", "Mujer", "Hombre", "Hombre") sexo[1] "Mujer" "Hombre" "Mujer" "Hombre" "Mujer" "Mujer" "Hombre" [8] "Hombre" -
Convertir el vector anterior en un factor.
TipSoluciónLa función
factor(vector, labels)permite convertirvectoren un factor con los niveles o categorías especificados enlabels. Si no se indicalabels, 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 -
Mostrar los niveles del factor.
TipSoluciónLa función
levels(factor)permite mostrar los niveles del factorfactor.levels(sexo)[1] "Hombre" "Mujer" -
Reordenar los niveles del factor para que la categoría “Mujer” sea la primera.
Ejercicio 2.3 Realizar las siguientes operaciones con matrices.
-
Crear una matriz de 2 filas y 2 columnas con los números del 1 al 4.
TipSoluciónLa función
matrix(vector, nrow, ncol)permite crear una matriz con los datos devectorel número de filas indicado ennrowy el número de columnas indicado enncol.A <- matrix(1:4, nrow = 2, ncol = 2) A[,1] [,2] [1,] 1 3 [2,] 2 4 -
Añadir a la matriz anterior una nueva columna con los números del 5 y 6.
TipSoluciónLa función
cbind(matriz, vector)permite añadir una nueva columna a la matrizmatrizcon los datos devector.A <- cbind(A, 5:6) A[,1] [,2] [,3] [1,] 1 3 5 [2,] 2 4 6 -
Crear una matriz de 2 filas y 2 columnas con los números del 1 al 4, rellenando los elementos por filas.
TipSoluciónLa función
matrixrellena los elementos de la matriz por columnas. Para rellenar los elementos por filas, se puede utilizar el parámetro opcionalbyrow = TRUE.B <- matrix(1:4, nrow = 2, ncol = 2, byrow = TRUE) B[,1] [,2] [1,] 1 2 [2,] 3 4 -
Crear otra matriz a partir de la anterior añadiendo una fila con los números 5 y 6.
TipSoluciónB <- rbind(B, 5:6) B[,1] [,2] [1,] 1 2 [2,] 3 4 [3,] 5 6 -
Acceder al elemento de la segunda fila y la primera columna de la matriz anterior.
TipSoluciónB[2, 1][1] 3 -
Seleccionar la primera fila de la matriz.
TipSoluciónB[1, ][1] 1 2 -
Seleccionar la segunda columna de la matriz.
TipSoluciónB[, 2][1] 2 4 6 -
Multiplicar la matriz A por la matriz B.
TipSoluciónLa multiplicación de matrices se realiza con el operador
%*%.A %*% B[,1] [,2] [1,] 35 44 [2,] 44 56 -
Calcular la transpuesta de la matriz A.
TipSoluciónLa función
t(matriz)permite calcular la transpuesta dematriz.t(A)[,1] [,2] [1,] 1 2 [2,] 3 4 [3,] 5 6
Ejercicio 2.4 Realizar las siguientes operaciones con listas.
-
Crear una lista con los siguientes con los datos del siguiente alumno:
- Nombre: Juan.
- Edad: 20 años.
TipSoluciónPara 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 -
Obtener la edad del alumno.
TipSoluciónPara acceder a los elementos de una lista se utiliza el operador
$.alumno$Edad[1] 20 -
Crear una lista con las siguientes notas del alumno:
- Matemáticas: 7.
- Química: 8.
TipSoluciónnotas <- list(Matemáticas = 7, Química = 8) notas$Matemáticas [1] 7 $Química [1] 8 -
Añadir la lista de notas a la lista del alumno.
TipSoluciónalumno$Notas <- notas alumno$Nombre [1] "Juan" $Edad [1] 20 $Notas $Notas$Matemáticas [1] 7 $Notas$Química [1] 8 -
Añadir a la lista anterior la nota del examen de Física, que ha sido un 6.
TipSoluciónalumno$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 |
-
Crear un data frame con los datos de la tabla.
TipSoluciónPara crear un data frame se utiliza la función
data.frame(columna1 = vector1, columna2 = vector2, ...), dondecolumna1,columna2, … son los nombres de las columnas yvector1,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) ) dfMes Ingresos Gastos Enero 45000 33400 Febrero 41500 35400 Marzo 51200 35600 -
Añadir una nueva columna con los siguientes impuestos pagados.
Mes Impuestos Enero 6450 Febrero 6300 Marzo 7100 TipSoluciónCon las funciones del paquete
basede R.df$Impuestos <- c(6450, 6300, 7100) dfMes Ingresos Gastos Impuestos Enero 45000 33400 6450 Febrero 41500 35400 6300 Marzo 51200 35600 7100 -
Añadir una nueva fila con los siguientes datos de Abril.
Mes Ingresos Gastos Impuestos Abril 49700 36300 6850 TipSoluciónCon las funciones del paquete
basede R.Con las funciones del paquete
dplyrdetidyverse.df <- df |> add_row(Mes = "Abril", Ingresos = 49700, Gastos = 36300, Impuestos = 6850) dfMes Ingresos Gastos Impuestos Enero 45000 33400 6450 Febrero 41500 35400 6300 Marzo 51200 35600 7100 Abril 49700 36300 6850 -
Cambiar los ingresos de Marzo por 50400.
TipSolucióndf[3, "Ingresos"] <- 50400 dfMes Ingresos Gastos Impuestos Enero 45000 33400 6450 Febrero 41500 35400 6300 Marzo 50400 35600 7100 Abril 49700 36300 6850 -
Guardar el data frame en un fichero csv.
TipSoluciónLa función
write.csv(dataframe, "fichero.csv")permite guardar el data framedataframeen el ficherofichero.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.
-
Crear un data frame con los datos de todos los pacientes del estudio a partir del fichero
colesterol.csvy mostrar las primeras filas.TipSoluciónCon las funciones del paquete
basede R. La funciónread.csv("fichero.csv")permite leer un fichero csv y cargar los datos en un data frame. Y la funciónhead(dataframe)permite mostrar las primeras filas del data framedataframe.nombre edad sexo peso altura colesterol José Luis Martínez Izquierdo 18 H 85 1.79 182 Rosa Díaz Díaz 32 M 65 1.73 232 Javier García Sánchez 24 H NA 1.81 191 Carmen López Pinzón 35 M 65 1.70 200 Marisa López Collado 46 M 51 1.58 148 Antonio Ruiz Cruz 68 H 66 1.74 249 Con la función
read_csvdel paquete del paquetereadrdetidyverse.nombre edad sexo peso altura colesterol José Luis Martínez Izquierdo 18 H 85 1.79 182 Rosa Díaz Díaz 32 M 65 1.73 232 Javier García Sánchez 24 H NA 1.81 191 Carmen López Pinzón 35 M 65 1.70 200 Marisa López Collado 46 M 51 1.58 148 Antonio Ruiz Cruz 68 H 66 1.74 249 -
Mostrar las variables del data frame.
TipSoluciónCon las funciones del paquete
basede R.colnames(df)[1] "nombre" "edad" "sexo" "peso" "altura" [6] "colesterol"Con la función
glimpsedel paquetedplyrdetidyverse. 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.glimpse(df)Rows: 14 Columns: 6 $ nombre <chr> "José Luis Martínez Izquierdo", "Rosa Díaz Díaz",… $ edad <dbl> 18, 32, 24, 35, 46, 68, 51, 22, 35, 46, 53, 58, 2… $ sexo <chr> "H", "M", "H", "M", "M", "H", "H", "M", "H", "H",… $ peso <dbl> 85, 65, NA, 65, 51, 66, 62, 60, 90, 75, 55, 78, 1… $ altura <dbl> 1.79, 1.73, 1.81, 1.70, 1.58, 1.74, 1.72, 1.66, 1… $ colesterol <dbl> 182, 232, 191, 200, 148, 249, 276, NA, 241, 280, … -
Mostrar el número de filas del data frame, que corresponde al número de pacientes.
TipSoluciónLa función
nrow(dataframe)permite mostrar el número de filas del data framedataframe.nrow(df)[1] 14 -
Mostrar 5 filas aleatorias del data frame.
TipSoluciónLa función
sample(vector, n)permite seleccionarnelementos aleatorios devector. El muestreo es sin reemplazamiento.La función
sample_n(dataframe, n)del paquetedplyrdetidyversepermite seleccionarnfilas aleatorias del data framedataframe.df |> sample_n(5)nombre edad sexo peso altura colesterol Rosa Díaz Díaz 32 M 65 1.73 232 José Luis Martínez Izquierdo 18 H 85 1.79 182 Antonio Ruiz Cruz 68 H 66 1.74 249 Carolina Rubio Moreno 20 M 61 1.77 194 Antonio Fernández Ocaña 51 H 62 1.72 276 -
Obtener los datos de colesterol de los pacientes.
-
Obtener los datos del quinto paciente.
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 |
Crear un vector con los nombres de los alumnos.
Crear un factor el grupo.
Crear un vector con las notas de Física y otro con las notas de Química.
Crear un vector con la nota media de las dos asignaturas.
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.
Crear un vector con los nombres de los alumnos que han aprobado el curso.
Crear un data frame con los nombres de los alumnos, sus notas y su media reutilizando los vectores anteriores.
Guardar el data frame en un fichero csv.
