Administración del entorno

Limpia previamente tu espacio de trabajo. Crea un archivo Markdown, desde cero, copiando el enunciado de cada ejercicio e incrustando el código R y las salidas.

  1. La función ls:
mi_var1 <-1
mi_var2 <- "dos"
mi_var3 <- "III"
ls()
## [1] "mi_var1" "mi_var2" "mi_var3"

Indica la opción correcta:

  1. Lista el contenido del directorio de trabajo

  2. Es la abreviatura de list sort y ordena la lista de variables

  3. 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. Para crear variables ocultas, el nombre de la variable debe comenzar con un “.”.
.var_oculta <- "no me ves"
.var_oculta
## [1] "no me ves"

Utiliza la función apropiada para listar variables de tu entorno. Averigua cómo mostrar variables ocultas.

ls(all.names = TRUE)
## [1] ".var_oculta" "mi_var1"     "mi_var2"     "mi_var3"
v_rnd <- sample(1:3)

Vuelve a listar las variables ocultas y observa qué ha ocurrido. Trata de explica a qué se debe.

ls(all.names = TRUE)
## [1] ".Random.seed" ".var_oculta"  "mi_var1"      "mi_var2"      "mi_var3"     
## [6] "v_rnd"

R utiliza la semilla de generación de números aleatorios como variable ocullta

  1. 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. Hazlo también en tu instalación de R de linux
install.packages("gapminder")

Carga la librería gapminder en tu script

library(gapminder)
  1. Directorios en R. La función getwd() permite obtener nuestro directorio de trabajo. Comprueba tu directorio de trabajo por defecto en Windows. Si vas a trabajar con discos externos, conviene siempre establecer el entorno antes de trabajar con R. Para ello, está la función setwd(). Elige tu entorno de trabajo, seleccionando el directorio de tu disco externo, por ejemplo:
setwd("mi_directorio")
getwd()
  1. (Extra) Crea un script .R en tu máquina linux. Comprueba el entorno de trabajo y cámbialo. ¿Qué precauciones habría que tomar si desarrollamos en Windows y subimos a producción en linux? Crea la variable de entorno en Windows “R_WD” y asígnale el directorio de trabajo. Haz lo mismo en linux. Utiliza setwd() apropiadamente tirando de la variable de entorno.
Sys.getenv()
  1. 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 100 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 ...
a <- 1
print(a)
history(100)
sink() # Esto cierra el fichero en el fichero logs.Rout y la salida vuelve a la consola
  1. Guarda el espacio de trabajo con la función save.image(“mi_espacio.RData”). Carga el espacio de trabajo en tu versión linux de R. Utiliza la función load().
save.image("mi_espacio.RData")
load("mi_espacio.RData")

Estructuras de datos

  1. Repaso Factores. Crea el factor fcalif, teniendo en cuenta el orden de los niveles indicados y las etiquetas dadas.
notas <- c(3, 0, 4, 6, 8, 10, 9, 8, 7, 7, 6, 7, 5)
calificaciones <- c("S","S","S","A","N","MH","Sb","N","N","N","A","N","A")
niveles = c("S", "A", "N", "Sb", "MH")
etiquetas = c("Suspenso", "Aprobado", "Notable", "Sobresaliente", "Matrícula de Honor")
fcalif <- factor(calificaciones, ordered = TRUE, levels = niveles, labels=etiquetas)
  1. Con los datos anteriores, saca el promedio de notas de los alumnos con suspenso, aprobado y notable.
#suspensos:
mean(notas[fcalif=="Suspenso"])
## [1] 2.333333
#aprobados
mean(notas[fcalif=="Aprobado"])
## [1] 5.666667
#notables
mean(notas[fcalif=="Notable"])
## [1] 7.4
  1. 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?
  1. 6

  2. 1694

c) 1704

  1. 10
gapminder
## # A tibble: 1,704 x 6
##    country     continent  year lifeExp      pop gdpPercap
##    <fct>       <fct>     <int>   <dbl>    <int>     <dbl>
##  1 Afghanistan Asia       1952    28.8  8425333      779.
##  2 Afghanistan Asia       1957    30.3  9240934      821.
##  3 Afghanistan Asia       1962    32.0 10267083      853.
##  4 Afghanistan Asia       1967    34.0 11537966      836.
##  5 Afghanistan Asia       1972    36.1 13079460      740.
##  6 Afghanistan Asia       1977    38.4 14880372      786.
##  7 Afghanistan Asia       1982    39.9 12881816      978.
##  8 Afghanistan Asia       1987    40.8 13867957      852.
##  9 Afghanistan Asia       1992    41.7 16317921      649.
## 10 Afghanistan Asia       1997    41.8 22227415      635.
## # ... with 1,694 more rows
  1. Data frames de ejemplo en R. Utiliza las funciones head y tail para:
mtcars
##                      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
## Toyota Corona       21.5   4 120.1  97 3.70 2.465 20.01  1  0    3    1
## Dodge Challenger    15.5   8 318.0 150 2.76 3.520 16.87  0  0    3    2
## AMC Javelin         15.2   8 304.0 150 3.15 3.435 17.30  0  0    3    2
## Camaro Z28          13.3   8 350.0 245 3.73 3.840 15.41  0  0    3    4
## Pontiac Firebird    19.2   8 400.0 175 3.08 3.845 17.05  0  0    3    2
## 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
## Ford Pantera L      15.8   8 351.0 264 4.22 3.170 14.50  0  1    5    4
## Ferrari Dino        19.7   6 145.0 175 3.62 2.770 15.50  0  1    5    6
## Maserati Bora       15.0   8 301.0 335 3.54 3.570 14.60  0  1    5    8
## Volvo 142E          21.4   4 121.0 109 4.11 2.780 18.60  1  1    4    2
# Imprime las 2 primeras filas
head(mtcars, n=2)
##               mpg cyl disp  hp drat    wt  qsec vs am gear carb
## Mazda RX4      21   6  160 110  3.9 2.620 16.46  0  1    4    4
## Mazda RX4 Wag  21   6  160 110  3.9 2.875 17.02  0  1    4    4
# Imprime las 10 últimas filas
tail(mtcars, n=10)
##                   mpg cyl  disp  hp drat    wt  qsec vs am gear carb
## AMC Javelin      15.2   8 304.0 150 3.15 3.435 17.30  0  0    3    2
## Camaro Z28       13.3   8 350.0 245 3.73 3.840 15.41  0  0    3    4
## Pontiac Firebird 19.2   8 400.0 175 3.08 3.845 17.05  0  0    3    2
## 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
## Ford Pantera L   15.8   8 351.0 264 4.22 3.170 14.50  0  1    5    4
## Ferrari Dino     19.7   6 145.0 175 3.62 2.770 15.50  0  1    5    6
## Maserati Bora    15.0   8 301.0 335 3.54 3.570 14.60  0  1    5    8
## Volvo 142E       21.4   4 121.0 109 4.11 2.780 18.60  1  1    4    2
  1. Utilizando una única función, analiza la estructura del dataframe mtcars e indica:
str(mtcars)
## 'data.frame':    32 obs. of  11 variables:
##  $ mpg : num  21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
##  $ cyl : num  6 6 4 6 8 6 8 4 4 6 ...
##  $ disp: num  160 160 108 258 360 ...
##  $ hp  : num  110 110 93 110 175 105 245 62 95 123 ...
##  $ drat: num  3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
##  $ wt  : num  2.62 2.88 2.32 3.21 3.44 ...
##  $ qsec: num  16.5 17 18.6 19.4 17 ...
##  $ vs  : num  0 0 1 1 0 1 0 1 1 1 ...
##  $ am  : num  1 1 1 0 0 0 0 0 0 0 ...
##  $ gear: num  4 4 4 3 3 3 3 4 4 4 ...
##  $ carb: num  4 4 1 1 2 1 4 2 2 4 ...

Nº total de observaciones: 32 Nº total de variables: 11 Tipo de cada variable: num

  1. Crea un data frame con la estructura de la tabla “meses” a partir de los siguientes vectores:
mesid <- 1:12
mesnombre <- c("Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre")
mescorto <- substr(mesnombre, 1,3)
mesesdf <- data.frame(mesid, mesnombre, mescorto)
  1. Crea otro data frame con las 4 columnas y la estructura de la tabla “dias_semana”
diasemanaid <- 1:7
diasemananombre <- c("Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado", "Domingo")
diasemananombrecorto <- substr(diasemananombre, 1,3)
diasemanaletra <- substr(diasemananombre, 1,1)
diasemanadf <- data.frame(diasemanaid, diasemananombre, diasemananombrecorto, diasemanaletra)
  1. 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.
esfestivo <- diasemanaletra == "D"
diasemanadf <- cbind(diasemanadf, esfestivo)
  1. La función list() permite crear listas. A partir de los tres vectores siguientes, crea una lista
mi_vector <-1:20
mi_matriz <-matrix(1:9,ncol=3,byrow=TRUE)
mi_df <- mtcars[1:5,]
mi_lista <- list(mi_vector, mi_matriz, mi_df)
  1. A partir del vector de nombres dado, utiliza la función names() para nombrar los elementos de la lista anterior e imprime la lista
v_nombres <- c("Vec", "Mat", "Df")
names(mi_lista) <- v_nombres
mi_lista
## $Vec
##  [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20
## 
## $Mat
##      [,1] [,2] [,3]
## [1,]    1    2    3
## [2,]    4    5    6
## [3,]    7    8    9
## 
## $Df
##                    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
## Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
  1. 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.
mi_lista$Vec[7]
## [1] 7
mi_lista$Vec[7] <-77
mi_lista
## $Vec
##  [1]  1  2  3  4  5  6 77  8  9 10 11 12 13 14 15 16 17 18 19 20
## 
## $Mat
##      [,1] [,2] [,3]
## [1,]    1    2    3
## [2,]    4    5    6
## [3,]    7    8    9
## 
## $Df
##                    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
## Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
  1. A partir de los datos del dataframe contenido en mi_lista encuentra e imprime el valor “mpg” para el Datsun 710
mi_lista$Df["Datsun 710","mpg"]
## [1] 22.8
  1. 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))
##               mpg cyl disp  hp drat    wt  qsec vs am gear carb
## Mazda RX4      21   6  160 110  3.9 2.620 16.46  0  1    4    4
## Mazda RX4 Wag  21   6  160 110  3.9 2.875 17.02  0  1    4    4
subset(mi_lista$Df, (cyl==6 & gear>3), select=c("wt", "qsec"))
##                  wt  qsec
## Mazda RX4     2.620 16.46
## Mazda RX4 Wag 2.875 17.02
  1. Utilizando el dataframe, extrae 100 muestras aleatorias sin repetición. Hazo en una sola línea.
muestras_gm <- gapminder[sample(1:nrow(gapminder),100,replace=FALSE),] # Utiliza sample() y nrow() para extraer las muestras
muestras_gm
## # A tibble: 100 x 6
##    country          continent  year lifeExp      pop gdpPercap
##    <fct>            <fct>     <int>   <dbl>    <int>     <dbl>
##  1 Iceland          Europe     1997    79.0   271192    28061.
##  2 Mali             Africa     1992    48.4  8416215      739.
##  3 Mauritius        Africa     1982    66.7   992040     3688.
##  4 Montenegro       Europe     2002    74.0   720230     6557.
##  5 Swaziland        Africa     1967    46.6   420690     2613.
##  6 Hong Kong, China Asia       1982    75.4  5264500    14561.
##  7 Greece           Europe     1957    67.9  8096218     4916.
##  8 Iran             Asia       1987    63.0 51889696     6643.
##  9 Congo, Rep.      Africa     1967    52.0  1179760     2678.
## 10 Egypt            Africa     2007    71.3 80264543     5581.
## # ... with 90 more rows

Funciones

  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.
ec_2grado_tipo <- funcion(a,b,c) {
  
}
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)
ec_2grado_tipo <- function(a,b,c) {
  sol = NA
  discriminante <- b^2 - 4*a*c
  if(a != 0) {
    
    if (discriminante > 0) {
      sol <- 2
    }
    if (discriminante == 0) {
      sol <- 1
    }
    if (discriminante < 0) {
      sol <- 0
    }
  }
  return (sol)
}
ec_2grado_tipo(a=2,b=5,c=0)
## [1] 2
ec_2grado_tipo(a=1,b=2,c=1)
## [1] 1
ec_2grado_tipo(a=1,b=2,c=3)
## [1] 0
ec_2grado_tipo(a=0,b=2,c=0)
## [1] NA
  1. 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
ec_2grado_solr <- funcion(a,b,c) {

}
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)
ec_2grado_solr <- function(a,b,c) {
  sol = NA
  if(!is.na(ec_2grado_tipo(a,b,c)) & ec_2grado_tipo(a,b,c) > 0)
  {
    sol = c((-b+sqrt(b^2-4*a*c))/(2*a), (-b-sqrt(b^2-4*a*c))/(2*a))
  }
  return (sol)
}
ec_2grado_solr(a=2,b=5,c=0)
## [1]  0.0 -2.5
ec_2grado_solr(a=1,b=2,c=1)
## [1] -1 -1
ec_2grado_solr(a=1,b=2,c=3)
## [1] NA
ec_2grado_solr(a=0,b=2,c=0)
## [1] NA
  1. 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.
ec_2grado <- funcion(a,b,c) {
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)
}
ec_2grado <- function(a,b,c) {
  sol = NA
  if(!is.na(ec_2grado_tipo(a,b,c)) & ec_2grado_tipo(a,b,c) > 0)
  {
    sol = c((-b+sqrt(b^2-4*a*c))/(2*a), (-b-sqrt(b^2-4*a*c))/(2*a))
  } else {
    sol = c((-b+sqrt(as.complex(b^2-4*a*c)))/(2*a), (-b-sqrt(as.complex(b^2-4*a*c)))/(2*a))
  }
  
  return (sol)
}
ec_2grado(a=2,b=5,c=0)
## [1]  0.0 -2.5
ec_2grado(a=1,b=2,c=1)
## [1] -1 -1
ec_2grado(a=1,b=0,c=1)
## [1] 0+1i 0-1i
ec_2grado(a=0,b=2,c=0)
## [1]  NaN+NaNi -Inf+NaNi