#Ejercicios

Resolver la siguiente ecuacion: \(x^2+x-1=0\)

#ax^2+bx+c
a <- 1
b <- 1
c <- -1
x1 <- (-1*b+sqrt(b^2-4*a*c))/(2*a)
x2 <- (-1*b-sqrt(b^2-4*a*c))/(2*a)

Resolver la siguiente ecuacion: \(2x^2-x-4=0\)

a <- 2
b <- -1
c <- -4

x3 <- (-1*b+sqrt(b^2-4*a*c))/(2*a)
x4 <- (-1*b-sqrt(b^2-4*a*c))/(2*a)

Clacular: log base 4 de 1024.

log(1024)/log(4)
## [1] 5

Instalar el paquete “dslabs” y analizar el movielens.

#
library(dslabs)
## Warning: package 'dslabs' was built under R version 4.1.3
data1 <- movielens
str(data1)
## 'data.frame':    100004 obs. of  7 variables:
##  $ movieId  : int  31 1029 1061 1129 1172 1263 1287 1293 1339 1343 ...
##  $ title    : chr  "Dangerous Minds" "Dumbo" "Sleepers" "Escape from New York" ...
##  $ year     : int  1995 1941 1996 1981 1989 1978 1959 1982 1992 1991 ...
##  $ genres   : Factor w/ 901 levels "(no genres listed)",..: 762 510 899 120 762 836 81 762 844 899 ...
##  $ userId   : int  1 1 1 1 1 1 1 1 1 1 ...
##  $ rating   : num  2.5 3 3 2 4 2 2 2 3.5 2 ...
##  $ timestamp: int  1260759144 1260759179 1260759182 1260759185 1260759205 1260759151 1260759187 1260759148 1260759125 1260759131 ...

#Clase2

# Asignacion de elemenetos 

x <- 2

x <- 3*x

# Para borrar las variables u objetos usamos la funcion rm("objeto")
rm(a)
rm(b)

Estructuras de datos (Objetos)

Vectores

vector1 <- 3
is.vector(vector1)
## [1] TRUE
# vectores de dim mayor a 1
x <- c(11,12,13,14)
x
## [1] 11 12 13 14
is.vector(x)
## [1] TRUE
z <- c("a","b","c")
z
## [1] "a" "b" "c"
y <- c(x,21,31,x) #se puede unir un vector a otro
y
##  [1] 11 12 13 14 21 31 11 12 13 14
#repeticion de elementos

rep(z,times=5)
##  [1] "a" "b" "c" "a" "b" "c" "a" "b" "c" "a" "b" "c" "a" "b" "c"
rep(z,each=5)
##  [1] "a" "a" "a" "a" "a" "b" "b" "b" "b" "b" "c" "c" "c" "c" "c"
x
## [1] 11 12 13 14
y
##  [1] 11 12 13 14 21 31 11 12 13 14
x+y
## Warning in x + y: longitud de objeto mayor no es múltiplo de la longitud de uno
## menor
##  [1] 22 24 26 28 32 43 24 26 24 26
v2 <- c(380,124,818)
v3 <- c("Italia","Canada","Egipto")
v2
## [1] 380 124 818
v3
## [1] "Italia" "Canada" "Egipto"
b1 <- c(Italia=380,Canada=124, Egipto=818)
b1
## Italia Canada Egipto 
##    380    124    818
#Para renombrar los nombres de las variables
paises <- c("IT","CA","EG")
names(b1) <- paises 
b1
##  IT  CA  EG 
## 380 124 818
v2
## [1] 380 124 818
v2[3]
## [1] 818
v2[1:2]
## [1] 380 124
v2[c(1,3)]
## [1] 380 818
x <- c(1,"canada",3)
x
## [1] "1"      "canada" "3"
str(x)
##  chr [1:3] "1" "canada" "3"
class(x)
## [1] "character"
x <- c(31,4,15,92,65)
x
## [1] 31  4 15 92 65
# considera la posicion del vector de acuerdo a su valor mas pequeño al mas grande
rank(x)
## [1] 3 1 2 5 4
# ordena los datos de menor a mayor
sort(x)
## [1]  4 15 31 65 92
# ordena los datos de mayor a menor
sort(x, decreasing = TRUE)
## [1] 92 65 31 15  4
 library(dslabs)
m <- murders
View(m)
v1<-m$total
sort(v1)
##  [1]    2    4    5    5    7    8   11   12   12   16   19   21   22   27   32
## [16]   36   38   53   63   65   67   84   93   93   97   97   99  111  116  118
## [31]  120  135  142  207  219  232  246  250  286  293  310  321  351  364  376
## [46]  413  457  517  669  805 1257
sort(v1,decreasing = TRUE)
##  [1] 1257  805  669  517  457  413  376  364  351  321  310  293  286  250  246
## [16]  232  219  207  142  135  120  118  116  111   99   97   97   93   93   84
## [31]   67   65   63   53   38   36   32   27   22   21   19   16   12   12   11
## [46]    8    7    5    5    4    2
#¿como encontramos el mayor vaor de v1?
max(v1)
## [1] 1257
min(v1)
## [1] 2
#¿cual es la posicion del vector en donde esta el valor max?
which.max(v1) #posicion del valor mas alto
## [1] 5
which.min(v1)#posicion del valor mas pequeño
## [1] 46

El nombre del estado que tiene la máxima población

m$state[which.max(m$population)]
## [1] "California"
rm(estado)
## Warning in rm(estado): objeto 'estado' no encontrado
# como obtenemos una tasa de homicidios 

rate <- m$total/m$population *100000
sort(rate)
##  [1]  0.3196211  0.3798036  0.5145920  0.5947151  0.6893484  0.7655102
##  [7]  0.7959810  0.8280881  0.8871131  0.9396843  0.9825837  0.9992600
## [13]  1.2128379  1.2924531  1.3829942  1.4571013  1.5200933  1.7056487
## [19]  1.7521372  1.8021791  2.1900730  2.2081106  2.6679599  2.6732010
## [25]  2.6751860  2.6871225  2.7139722  2.7980319  2.8244238  2.8369608
## [31]  2.9589340  2.9993237  3.1104763  3.1246001  3.1893901  3.2013603
## [37]  3.2537239  3.3741383  3.3980688  3.4509357  3.5977513  3.6295273
## [43]  3.7903226  4.0440846  4.1786225  4.2319369  4.4753235  5.0748655
## [49]  5.3598917  7.7425810 16.4527532
sort(rate,decreasing=TRUE)
##  [1] 16.4527532  7.7425810  5.3598917  5.0748655  4.4753235  4.2319369
##  [7]  4.1786225  4.0440846  3.7903226  3.6295273  3.5977513  3.4509357
## [13]  3.3980688  3.3741383  3.2537239  3.2013603  3.1893901  3.1246001
## [19]  3.1104763  2.9993237  2.9589340  2.8369608  2.8244238  2.7980319
## [25]  2.7139722  2.6871225  2.6751860  2.6732010  2.6679599  2.2081106
## [31]  2.1900730  1.8021791  1.7521372  1.7056487  1.5200933  1.4571013
## [37]  1.3829942  1.2924531  1.2128379  0.9992600  0.9825837  0.9396843
## [43]  0.8871131  0.8280881  0.7959810  0.7655102  0.6893484  0.5947151
## [49]  0.5145920  0.3798036  0.3196211
?sort
## starting httpd help server ... done
?order
estado <- m$state
estado[order(rate,decreasing= TRUE)]
##  [1] "District of Columbia" "Louisiana"            "Missouri"            
##  [4] "Maryland"             "South Carolina"       "Delaware"            
##  [7] "Michigan"             "Mississippi"          "Georgia"             
## [10] "Arizona"              "Pennsylvania"         "Tennessee"           
## [13] "Florida"              "California"           "New Mexico"          
## [16] "Texas"                "Arkansas"             "Virginia"            
## [19] "Nevada"               "North Carolina"       "Oklahoma"            
## [22] "Illinois"             "Alabama"              "New Jersey"          
## [25] "Connecticut"          "Ohio"                 "Alaska"              
## [28] "Kentucky"             "New York"             "Kansas"              
## [31] "Indiana"              "Massachusetts"        "Nebraska"            
## [34] "Wisconsin"            "Rhode Island"         "West Virginia"       
## [37] "Washington"           "Colorado"             "Montana"             
## [40] "Minnesota"            "South Dakota"         "Oregon"              
## [43] "Wyoming"              "Maine"                "Utah"                
## [46] "Idaho"                "Iowa"                 "North Dakota"        
## [49] "Hawaii"               "New Hampshire"        "Vermont"
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.1.3
## 
## Attaching package: 'dplyr'
## 
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## 
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
data2 <- m %>% mutate(rate= m$total/m$population *100000)
View(data2)

# para redondear decimales usamos esta funcion: round(vector,n)
round(3.453435,2)
## [1] 3.45

¿Cual sería la diferencia al usar order() y sort()?

x <- c(2,43,27,96,18)

order(x)
## [1] 1 5 3 2 4
sort(x)
## [1]  2 18 27 43 96
rank(x)
## [1] 1 4 3 5 2
# Si el vector "times" representa el tiempo en minutos, pasar a horas y que tenga dos decimales

times<- c(10,30,40,50)
times <- round(times/60,2)

Data frames

Un data frame es una lista de vectores, que cumple:

Nombre <-  c("Andres","Gabriela","Israel","Juan")
Edad <- c(21,22,19,"22")
Ciudad <- c("Quito","Cuenca","Loja","Quito")

df_1 <- data.frame(Nombre,Edad,Ciudad)

df_1$Ciudad <- as.factor(df_1$Ciudad)
str(df_1)
## 'data.frame':    4 obs. of  3 variables:
##  $ Nombre: chr  "Andres" "Gabriela" "Israel" "Juan"
##  $ Edad  : chr  "21" "22" "19" "22"
##  $ Ciudad: Factor w/ 3 levels "Cuenca","Loja",..: 3 1 2 3
df_1$Edad <- as.numeric(df_1$Edad)
str(df_1)
## 'data.frame':    4 obs. of  3 variables:
##  $ Nombre: chr  "Andres" "Gabriela" "Israel" "Juan"
##  $ Edad  : num  21 22 19 22
##  $ Ciudad: Factor w/ 3 levels "Cuenca","Loja",..: 3 1 2 3
names(df_1) <- c("names","age","city")
# Para visualizar los primeros elementos del dataframe 
head(m, n=10) 
##                   state abb    region population total
## 1               Alabama  AL     South    4779736   135
## 2                Alaska  AK      West     710231    19
## 3               Arizona  AZ      West    6392017   232
## 4              Arkansas  AR     South    2915918    93
## 5            California  CA      West   37253956  1257
## 6              Colorado  CO      West    5029196    65
## 7           Connecticut  CT Northeast    3574097    97
## 8              Delaware  DE     South     897934    38
## 9  District of Columbia  DC     South     601723    99
## 10              Florida  FL     South   19687653   669
head(m,8)
##         state abb    region population total
## 1     Alabama  AL     South    4779736   135
## 2      Alaska  AK      West     710231    19
## 3     Arizona  AZ      West    6392017   232
## 4    Arkansas  AR     South    2915918    93
## 5  California  CA      West   37253956  1257
## 6    Colorado  CO      West    5029196    65
## 7 Connecticut  CT Northeast    3574097    97
## 8    Delaware  DE     South     897934    38
# Para visualizar los ultimos elementos
tail(m,2)
##        state abb        region population total
## 50 Wisconsin  WI North Central    5686986    97
## 51   Wyoming  WY          West     563626     5

listas

lista <- list(1,c("hola","mundo"),df_1)

str(lista)
## List of 3
##  $ : num 1
##  $ : chr [1:2] "hola" "mundo"
##  $ :'data.frame':    4 obs. of  3 variables:
##   ..$ names: chr [1:4] "Andres" "Gabriela" "Israel" "Juan"
##   ..$ age  : num [1:4] 21 22 19 22
##   ..$ city : Factor w/ 3 levels "Cuenca","Loja",..: 3 1 2 3
lista[[1]]
## [1] 1
lista[[2]]
## [1] "hola"  "mundo"
lista[[3]]
##      names age   city
## 1   Andres  21  Quito
## 2 Gabriela  22 Cuenca
## 3   Israel  19   Loja
## 4     Juan  22  Quito
lista[[3]]$names
## [1] "Andres"   "Gabriela" "Israel"   "Juan"

Matrices

matrix(1:12,nrow=3,ncol=4)
##      [,1] [,2] [,3] [,4]
## [1,]    1    4    7   10
## [2,]    2    5    8   11
## [3,]    3    6    9   12
# cbind() para unir vectores, usando cada uno como una columna.
# rbind() para unir vectores, usando cada uno como un renglón.

Funciones

nombre_funciones <- function(arg1,arg2,...)
{
  # codigo
}

x <- c(3,4,5,6,7)
mean(x)
## [1] 5
media1 <- function(w)
{
  s <- sum(w)
  n <- length(w)
  s/n
}
#Retorna lo ultimo que se esta ejecutando

media1(x)
## [1] 5

Crear una funcion para resolver ecuaciones de segundo grado: \(ax^2+bx+c=0\) y resolver \(x^2+x-1=0\)

raices <- function(a,b,c)
{
  x1 <- (-1*b+sqrt(b^2-4*a*c))/(2*a)
  x2 <- (-1*b-sqrt(b^2-4*a*c))/(2*a)
  r <- c(x1,x2)
  return(r)
}

raices(1,1,-1)
## [1]  0.618034 -1.618034

Una progresión geométrica es una sucesión de números \(a_1\), \(a_2\), \(a_3\) de modo que cada uno de ellos (excepto el primero) es igual al último multiplicado por una constante \(r\) llamada ratio.

Se puede verificar que,

an <- function(a1,r,n)
{
  a1*r^(n-1)
}

an(a1=1,r=2,n=5)
## [1] 16
an(a1=1,n=5,r=2)
## [1] 16
an(1,2,5)
## [1] 16
args(an) # me muestra los argumentos de la funcion 
## function (a1, r, n) 
## NULL
sn <- function(a1,r,n)
{
  a1*(r^n-1)/(r-1)
}

sn(1,2,5)
## [1] 31
valores <- an(a1=1,r=2,1:18)
sum(valores)
## [1] 262143

Supongamos un dado legal, determinar una tabla de frecuencias al realizar el lanzamiento de un dado tomado n=200, 500, 1000, 100000

dado <- function(n=100)
{
  lanzamientos <- sample(1:6,n,rep=T)
  frecuencia <- table(lanzamientos)/n
  frecuencia
}

n <- 200
lanzamientos <- sample(1:6,n,rep=T) #genera n observaciones entre x=1,...,6 y se pueden repetir o no
frecuencia <- table(lanzamientos)/n # Table para contar

dado()
## lanzamientos
##    1    2    3    4    5    6 
## 0.22 0.13 0.25 0.16 0.12 0.12
dado(200)
## lanzamientos
##     1     2     3     4     5     6 
## 0.130 0.155 0.185 0.145 0.235 0.150
dado(500)
## lanzamientos
##     1     2     3     4     5     6 
## 0.144 0.162 0.164 0.170 0.180 0.180
dado(1000)
## lanzamientos
##     1     2     3     4     5     6 
## 0.180 0.151 0.165 0.161 0.168 0.175
dado(100000)
## lanzamientos
##       1       2       3       4       5       6 
## 0.16858 0.16569 0.16599 0.16673 0.16723 0.16578

Sentencias if else

if(condicion) { # la condicion debe devoolver TRUE O FALSE # Ejecuta un código } else { # Ejecuta otro código }

queremos evaluar una funcion por partes:

f(x)=0, si x menor a 0 f(x)=x/10, si x esta entre 0 y 10 f(x)= , si x es mayor a 10

f_partes <- function(x)
{
  if(x<0)
  {
    return(0)
  }
  else
  {
    if(x<=10)
    {
      return(x/10)
    }
    else
    {
      return(1)
    }
      
  }
}

f_partes(-1)
## [1] 0
f_partes(5)
## [1] 0.5
f_partes(100)
## [1] 1

Vamos a definir una funcion para definir si una funcion es par o impar.

# Para retornar texto: print("texto")
par_o_impar <- function(x)
{
     if( x%%2 == 0)
    {
      print("Par")
    }
   else
    {
      print("Impar")
    } 
  
}

par_o_impar(8)
## [1] "Par"

Sentencia ifelse

ifelse(vector_condicional, valor_si_TRUE, valor_si_FALSE)

seq(1,8)
## [1] 1 2 3 4 5 6 7 8
ifelse(seq(1,8)<5, TRUE, FALSE)
## [1]  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE

Supongamos los siguientes vectores

x <- c(“hombre”,“hombre”,“mujer”,“hombre”,“mujer”) y <- c(10,14,80,56,27)

mostrar género, y si es mayor o menor de edad.

x <- c("hombre","hombre","mujer","hombre","mujer")
y <- c(10,14,80,56,27)
ifelse(x=="hombre",ifelse(y>=18,"Hombre adulto","Hombre menor de edad"),ifelse(y>=18,"Mujer adulta","Mujer menor de edad"))
## [1] "Hombre menor de edad" "Hombre menor de edad" "Mujer adulta"        
## [4] "Hombre adulto"        "Mujer adulta"

#Bucle for

for( i in lista) { # Código }

mascotas <- c("bobi","rufo","fido","morti","lazy", "oso","rocky","rex", "rambo")

# "Mi perro se llamaba: bobi"
for(i in 1:length(mascotas))
{
  print(paste("Mi perro se llamaba:", mascotas[i])) # paste para unir texto en el print 
}
## [1] "Mi perro se llamaba: bobi"
## [1] "Mi perro se llamaba: rufo"
## [1] "Mi perro se llamaba: fido"
## [1] "Mi perro se llamaba: morti"
## [1] "Mi perro se llamaba: lazy"
## [1] "Mi perro se llamaba: oso"
## [1] "Mi perro se llamaba: rocky"
## [1] "Mi perro se llamaba: rex"
## [1] "Mi perro se llamaba: rambo"

Usando dos bucles uno dentro de otro calcular la matriz de Hilbert (es una matriz cuadrada cuyos campos constituyen una fracción de la unidad)

matriz_hilbert <- function(n)
{
  matriz <- matrix(0,nrow=n,ncol=n)
  for(i in 1:n)
  {
    for(j in 1:n)
    {
      matriz[i,j]=1/(i+j-1)
    }
  }
  matriz
}

matriz_hilbert(8)
##           [,1]      [,2]      [,3]       [,4]       [,5]       [,6]       [,7]
## [1,] 1.0000000 0.5000000 0.3333333 0.25000000 0.20000000 0.16666667 0.14285714
## [2,] 0.5000000 0.3333333 0.2500000 0.20000000 0.16666667 0.14285714 0.12500000
## [3,] 0.3333333 0.2500000 0.2000000 0.16666667 0.14285714 0.12500000 0.11111111
## [4,] 0.2500000 0.2000000 0.1666667 0.14285714 0.12500000 0.11111111 0.10000000
## [5,] 0.2000000 0.1666667 0.1428571 0.12500000 0.11111111 0.10000000 0.09090909
## [6,] 0.1666667 0.1428571 0.1250000 0.11111111 0.10000000 0.09090909 0.08333333
## [7,] 0.1428571 0.1250000 0.1111111 0.10000000 0.09090909 0.08333333 0.07692308
## [8,] 0.1250000 0.1111111 0.1000000 0.09090909 0.08333333 0.07692308 0.07142857
##            [,8]
## [1,] 0.12500000
## [2,] 0.11111111
## [3,] 0.10000000
## [4,] 0.09090909
## [5,] 0.08333333
## [6,] 0.07692308
## [7,] 0.07142857
## [8,] 0.06666667

#Matrix

1:12
##  [1]  1  2  3  4  5  6  7  8  9 10 11 12
A <- matrix(1:12, nrow=3, ncol= 4)
v1 <- 1:4
v2 <- 5:8
v3 <- 9:12
v4 <- 13:16

matriz <- rbind(v1,v2,v3,v4) #row por filas 

matriz2 <- cbind(v1,v2,v3,v4) #cols por columnas
class(matriz2)
## [1] "matrix" "array"
str(matriz2)
##  int [1:4, 1:4] 1 2 3 4 5 6 7 8 9 10 ...
##  - attr(*, "dimnames")=List of 2
##   ..$ : NULL
##   ..$ : chr [1:4] "v1" "v2" "v3" "v4"
dim(matriz2)
## [1] 4 4
matrix(1,nrow=3,ncol=3)
##      [,1] [,2] [,3]
## [1,]    1    1    1
## [2,]    1    1    1
## [3,]    1    1    1
# Consideremos una matriz de mxn(m:filas, n:columnas)
MHilbert <- function(m,n)
{
  y <- matrix(1,nrow=m,ncol=n)
  for (i in 1:m) {
    for (j in 1:n) {
      y[i,j]=1/(i+j-1)
    }
  }
  y
}

 MHilbert(3,3)
##           [,1]      [,2]      [,3]
## [1,] 1.0000000 0.5000000 0.3333333
## [2,] 0.5000000 0.3333333 0.2500000
## [3,] 0.3333333 0.2500000 0.2000000
library(dslabs)
library(dplyr)

data(murders)

murder_rate <- murders$total/murders$population*10000

data <- murders
data <- data %>% mutate(murder_rate)
View(data)