<-1
mi_var1 <- "dos"
mi_var2 <- "III" mi_var3
PRIA practica 2 (resuelta): Entorno, sintaxis RBase y estructuras de datos, y funciones
1. Administración del entorno
Limpia previamente tu espacio de trabajo. Crea un archivo qmd, desde cero, copiando el enunciado de cada ejercicio e incrustando el código R y las salidas.
1.1. La función ls():
Indica la opción correcta:
Lista el contenido del directorio de trabajo
Es la abreviatura de list sort y ordena la lista de variables
Genera código R automáticamente (function name, pos =-1…“)
d) Listará todas las variables y funciones almacenadas en el entorno global (tu sesión de trabajo en R)
1.2. Para crear variables ocultas, el nombre de la variable debe comenzar con un “.”.
<- "no me ves"
.var_oculta .var_oculta
Utiliza la función apropiada para listar variables de tu entorno. Averigua cómo mostrar variables ocultas.
ls(all.names = TRUE)
Crea un vector v_rnd con 3 elementos numéricos enteros aleatorios de 1 a 3. Utiliza la función sample()
<- sample(1:3) v_rnd
Vuelve a listar las variables ocultas y observa qué ha ocurrido. Trata de explica a qué se debe. Se debe a que al llamar a una función que genera variables aleatorias, se crea una semilla oculta
ls(all.names = TRUE)
1.3. Para poder usar ciertas librerías, es necesario tenerlas instaladas y cargarlas en nuestro script. Aunque ya se ha hecho dentro de R studio, por ejemplo para poder generar y visualizar rmarkdown, conviene tener en cuenta los comandos necesarios para instalar los paquetes, especialmente cuando se lleva un script a producción. Instala el paquete “gapminder” en tu entorno.
install.packages("gapminder")
Carga la librería gapminder en tu script
library(gapminder)
1.4. Directorios en R. La función getwd() permite obtener nuestro directorio de trabajo. Comprueba tu directorio de trabajo. Si vas a trabajar normalmente en ese directorio, crea una variable de entorno en tu sistema operativo con ese directorio. Imagina que has subido a producción tu código a una máquina virtual cloud con linux. ¿Cómo harías para que tu código fuente no cambie y establecer tu entorno de trabajo desde la variable de entorno? Leyendo primero la variable de entorno del sistema y usando setwd
getwd()
1.5. Lista las variables de entorno de tu sistema:
Sys.getenv("RWD")
1.6. Con el comando sink(“fichero.txt”), le indicas a R que escriba la salida por fichero en lugar de por el terminal. Volviendo a llamar a sink(), sin parámetros, termina y cierra el fichero y vuelve a mostrar las salidas por el terminal. Imprime los últimos 10 comandos que escribiste en R en un fichero.
sink("logs.Rout") # Deja de mostrar por consola la salida de los resultados y comienza a guardarlo en un fichero.
#varios comandos ...
<- 1
a print(a)
history(10)
sink() # Esto cierra el fichero en el fichero logs.Rout y la salida vuelve a la consola
1.7. Guarda el espacio de trabajo con la función save.image(“mi_espacio.RData”). Borra el historial y todas las variables y a continuación, carga el espacio de trabajo en tu versión linux de R.
save.image("mi_espacio.RData")
rm(list=ls(all.names=TRUE))
load("mi_espacio.RData")
2. Estructuras de datos. Repaso
2.1. Repaso Factores. Crea el factor fcalif, teniendo en cuenta el orden de los niveles indicados y las etiquetas dadas.
<- c(3, 0, 4, 6, 8, 10, 9, 8, 7, 7, 6, 7, 5)
notas <- c("S","S","S","A","N","MH","Sb","N","N","N","A","N","A")
calificaciones = c("S", "A", "N", "Sb", "MH")
niveles = c("Suspenso", "Aprobado", "Notable", "Sobresaliente", "Matrícula de Honor")
etiquetas <- factor(calificaciones, ordered = TRUE, levels = niveles, labels=etiquetas) fcalif
2.2. Con los datos anteriores, saca el promedio de notas de los alumnos con suspenso, aprobado y notable usando la sintaxis RBase: vector[expresión_filtro]
#suspensos:
mean(notas[fcalif=="Suspenso"])
#aprobados
mean(notas[fcalif=="Aprobado"])
#notables
mean(notas[fcalif=="Notable"])
2.3. Trabajando con data frames. Al haber cargado la librería “gapminder”, escribe el comando gapminder y podrás ver la estructura del data frame. ¿Cuántas observaciones (filas) tiene el dataset?
library(gapminder)
str(gapminder)
- 6
- 1694 c) 1704
- 10
2.4. Data frames de ejemplo en R. Utiliza las funciones head y tail para:
mtcars# Imprime las 2 primeras filas
head(mtcars, n=2)
# Imprime las 10 últimas filas
tail(mtcars, n=10)
2.5. Utilizando una única función, analiza la estructura del dataframe mtcars e indica: Nº total de observaciones: 32 Nº total de variables: 11 Tipo de cada variable: Todas num
str(mtcars)
class(mtcars$gear)
typeof(mtcars$gear)
<- mtcars
mi_mtcars $gear <- as.integer(mi_mtcars$gear)
mi_mtcarsstr(mi_mtcars)
class(mi_mtcars$gear)
typeof(mi_mtcars$gear)
class(mi_mtcars)
typeof(mi_mtcars)
2.6. Crea un data frame con la estructura de la tabla “meses” a partir de los siguientes vectores:
<- 1:12
mesid <- c("Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre")
mesnombre <- substr(mesnombre, 1,3)
mescorto <- data.frame(mesid, mesnombre, mescorto) mesesdf
2.7. Crea otro data frame con las 4 columnas y la estructura de la tabla “dias_semana”
<- 1:7
diasemanaid <- c("Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado", "Domingo")
diasemananombre <- substr(diasemananombre, 1,3)
diasemananombrecorto <- substr(diasemananombre, 1,1)
diasemanaletra <- data.frame(diasemanaid, diasemananombre, diasemananombrecorto, diasemanaletra) diasemanadf
2.8. Añade al dataframe dias_semana una quinta columna con valores lógicos “esFestivo”, indica TRUE para los domingos y false para el resto. Utiliza el comparador “==” para ello.
<- diasemanaletra == "D"
esfestivo <- cbind(diasemanadf, esfestivo) diasemanadf
2.9. La función list() permite crear listas. A partir de los tres vectores siguientes, crea una lista
<-1:20
mi_vector <-matrix(1:9,ncol=3,byrow=TRUE)
mi_matriz <- mtcars[1:5,]
mi_df <- list(mi_vector, mi_matriz, mi_df) mi_lista
2.10. A partir del vector de nombres dado, utiliza la función names() para nombrar los elementos de la lista anterior e imprime la lista
<- c("Vec", "Mat", "Df")
v_nombres names(mi_lista) <- v_nombres
mi_lista
2.11. Tanto en listas como en data frames, es común referirse a la posición del elmento o a la columna respectivamente, usando el símbolo mi_lista $nombre_elemento ó mi_df$nombre_columna para acceder a los datos de los elementos o columnas. Teniendo en cuenta que tienen nombres, imprime el elemento 7º del vector “Vec” de la lista. Sustituye su valor por 77 y vuelve a imprimir la lista completa.
$Vec[7]
mi_lista$Vec[7] <-77
mi_lista mi_lista
2.12. A partir de los datos del dataframe contenido en mi_lista encuentra e imprime el valor “mpg” para el Datsun 710
$Df["Datsun 710","mpg"] mi_lista
2.13. A partir de los datos del dataframe mi_lista, extrae, usando subset(), los vehículos con 6 cyl y 4 gear. Haz lo mismo pero imprime solamente wt y qsec. Añade el parámetro select a subset().
subset(mi_lista$Df, (cyl==6 & gear>3))
subset(mi_lista$Df, (cyl==6 & gear>3), select=c("wt", "qsec"))
2.14. Utilizando el dataframe, extrae 100 muestras aleatorias sin repetición. Hazo en una sola línea.
<- gapminder[sample(1:nrow(gapminder),100,replace=FALSE),] # Utiliza sample() y nrow() para extraer las muestras
muestras_gm # Utiliza sample() y nrow() para extraer las muestras muestras_gm
3. Funciones
Teoría y ejemplos en:
3.1 Sea \(a x^2 + b x + c = 0\) la ecuación y \(x = \frac {-b \pm \sqrt {b^2 - 4ac}}{2a}\) la solución a la misma, crea una función que reciba como parámetros a, b y c y devuelva 2 si tiene 2 soluciones reales. 1 si tiene una solución real, 0 si no tiene solución real o NA si a = 0.
<- function(a,b,c) {
ec_2grado_tipo = NA
sol <- b^2 - 4*a*c
discriminante if(a != 0) {
if (discriminante > 0) {
<- 2
sol
}if (discriminante == 0) {
<- 1
sol
}if (discriminante < 0) {
<- 0
sol
}
}
return (sol)
}
ec_2grado_tipo(a=2,b=5,c=0)
ec_2grado_tipo(a=1,b=2,c=1)
ec_2grado_tipo(a=1,b=2,c=3)
ec_2grado_tipo(a=0,b=2,c=0)
3.2 Escribe una función, que sirviéndose de la anterior, resuelva la ecuación en el campo de los números reales. Considera la salida un vector de 2 elementos numéricos
<- function(a,b,c) {
ec_2grado_solr = NA
sol if(!is.na(ec_2grado_tipo(a,b,c)) & ec_2grado_tipo(a,b,c) > 0)
{= c((-b+sqrt(b^2-4*a*c))/(2*a), (-b-sqrt(b^2-4*a*c))/(2*a))
sol
}return (sol)
}
ec_2grado_solr(a=2,b=5,c=0)
ec_2grado_solr(a=1,b=2,c=1)
ec_2grado_solr(a=1,b=2,c=3)
ec_2grado_solr(a=0,b=2,c=0)
3.3 Cuando no tiene solución real, considera utilizar los números complejos y escribe una función que resuelva cualquier tipo de ecuación, aunque tenga solución con números complejos. R dispone de herramientas para ello. Ayuda sqrt(as.complex(-1)) Considera la salida un vector de 2 elementos numéricos o complejos.
<- function(a,b,c) {
ec_2grado = NA
sol if(!is.na(ec_2grado_tipo(a,b,c)) & ec_2grado_tipo(a,b,c) > 0)
{= c((-b+sqrt(b^2-4*a*c))/(2*a), (-b-sqrt(b^2-4*a*c))/(2*a))
sol else {
} = c((-b+sqrt(as.complex(b^2-4*a*c)))/(2*a), (-b-sqrt(as.complex(b^2-4*a*c)))/(2*a))
sol
}
return (sol)
}
ec_2grado(a=2,b=5,c=0)
ec_2grado(a=1,b=2,c=1)
ec_2grado(a=1,b=0,c=1)
ec_2grado(a=0,b=2,c=0)