Ejercicios

Ejercicio 1

1- Cree una función que calcule el área de un triángulo rectángulo.

La fórmula para calcular el área de un triángulo rectángulo es Área = b x h/2

# Definición de la función del cálculo del tríangulo 

calculo.triangulo <- function(Base,Altura){
    area<- (Base)*(Altura)/2
    Resultado.area<- paste0("El área de tríangulo es ",area,"cm")
    return(Resultado.area)
}

# Determinación de escenarios

calculo.triangulo(6,7)
## [1] "El área de tríangulo es 21cm"
calculo.triangulo(9,18)
## [1] "El área de tríangulo es 81cm"
calculo.triangulo(8,9)
## [1] "El área de tríangulo es 36cm"

Ejercicio 2

2- Cree una función que permita convertir de grados centígrados a Fahrenheit.

Para convertir la temperatura de grados Celsius a Fahrenheit se aplica la fórmula:

# Definición de la función del cálculo de conversión de grados ºC a ºF 
calculo.Fahrenheit <- function(temp) {
  convertidor <- ((temp) * (9/5)) + 32
  Result.temperatura<-paste0(temp," grados ºC son ",convertidor," grados ºF ")
  return(Result.temperatura)
}

# Determinación de escenarios

 calculo.Fahrenheit(32)
## [1] "32 grados ºC son 89.6 grados ºF "
 calculo.Fahrenheit(45)
## [1] "45 grados ºC son 113 grados ºF "
 calculo.Fahrenheit(189.9)
## [1] "189.9 grados ºC son 373.82 grados ºF "

Ejercicio 3

3-Cree una función que permita al usuario: 3.1 Convertir de gramos a libras, de metros a millas y de grados centigrados a Fahrenheit. 3.2 Introducir el valor a convertir. 3.3 Devuelva el valor en función de lo escogido por el usuario.

conv.multiple<-function(conversion=c("gramos.libras","metros.millas","centi.Farenheit"),Cantidad) {
  
  if(conversion=="gramos.libras"){

gr.libras<-(Cantidad/453.592)
result.01<-paste0(Cantidad, " gramos son ",round(gr.libras,2)," libras.")
return(result.01)}


 else if(conversion=="metros.millas"){

 mts.millas<-Cantidad/1609.34
 result.02<-paste0(Cantidad, " metros son ",round(mts.millas,2)," millas.")
 return(result.02)}

 else if(conversion=="centi.Farenheit"){

   cel.faren<-((9/5)*Cantidad)+32
  result.03<-paste0(Cantidad," grados centigrados son ",round(cel.faren,2)," grados Fahrenheit.")
 return(result.03)
 }
  
  else{print("Error! Digite nuevamente el parámetro correcto ")}
  
}

# Determinación de escenarios

conv.multiple("gramos.libras",120)
## [1] "120 gramos son 0.26 libras."
conv.multiple("metros.millas",159)
## [1] "159 metros son 0.1 millas."
conv.multiple("centi.Farenheit",189.0)
## [1] "189 grados centigrados son 372.2 grados Fahrenheit."
conv.multiple("pulgada.cm",89)
## [1] "Error! Digite nuevamente el parámetro correcto "

Ejercicio 4

4- Investigue sobre el índice BigMac y genere lo siguiente:

• Descargue la información del índice de Big Mac del link respectivo.

• A continuación diseñe una función que reciba como argumentos el objeto del dataset creado desde el punto anterior.

• El segundo argumento debe ser un vector con el nombre de dos países a comparar, deseados por el usuario.

• Brinde como resultado un mensaje de texto que indique la comparación del valor del índice de Big Mac para los dos países.Por ejemplo: “El índice de Big Mac para Costa Rica es de 5$ dólares y para Nicaragua es de 2$ dolares.”

##install.packages("dplyr") y tidyverse
library(dplyr)
## 
## 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
bigmac<-read.csv("big-mac-full-index.csv",sep=",") %>%
arrange(name,desc(date)) %>%
top_n(1,wt = date)
 IndiceBigMac <- function(nPais1, nPais2){ 
  #Filtrar el valor de nPais1
  
 nombrePais1 <- bigmac %>% select(name) %>% 
  filter(name==nPais1) %>% 
  as.character()
  
#Se utiliza as.character para convertir un objeto a uno de tipo character
#para poderlo poner en el mensaje de texto.
  
    #Filtrar el valor de nPais2
  
 nombrePais2 <- bigmac %>% select(name) %>% 
  filter(name==nPais2) %>% 
  as.character()
  
  #Obtener el valor nuúmerico de nombrePais1
  
  BigMac1 <- bigmac%>% filter(name==nPais1) %>% select(dollar_price) %>% as.numeric()
  
    #Obtener el valor nuúmerico de nombrePais2
  
  BigMac2 <- bigmac %>% filter(name==nPais2) %>% select(dollar_price) %>% as.numeric()

resultadoBigMac<-paste0("El índice de Big Mac para ", nPais1 , " es de ", round(BigMac1,2), "$ dólares y para ", nPais2 , " es de ",round(BigMac2,2) ,"$ dólares.")

  return(resultadoBigMac ) 
  
  
}
 


# Determinación de escenarios

CálculoNIyMEX <- IndiceBigMac  (nPais1="Nicaragua",nPais2="Mexico")
CálculoAUSyISR <-  IndiceBigMac (nPais1="Australia",nPais2="Israel")
CálculoARGyBR <-  IndiceBigMac (nPais1="Argentina",nPais2="Brazil")

#Print
CálculoAUSyISR
## [1] "El índice de Big Mac para Australia es de 4.35$ dólares y para Israel es de 4.58$ dólares."
CálculoARGyBR
## [1] "El índice de Big Mac para Argentina es de 2$ dólares y para Brazil es de 4.55$ dólares."
CálculoNIyMEX 
## [1] "El índice de Big Mac para Nicaragua es de 3.18$ dólares y para Mexico es de 2.54$ dólares."

Ejercicio 5

5- Para la siguiente función:

• Indique linea por línea y de manera general cuál es la funcionalidad y propósito de la misma.

• Corrija el(los) error(es) que contiene la función.

• Compile la función corregida y pruebe con un dataset de su escogencia

# Datframe de prueba
df <- data.frame(Alajuela = round(runif(10,0,20000)),
                 Saprissa = round(runif(10,0,20000)),
                 Cartago = round(runif(10,0,5000)),
                 Heredia = round(runif(10,0,10000)),
                 PerezZeledon = round(runif(10,0,8000)),
                 SanCarlos = round(runif(10,0,6000)),
                 Grecia = round(runif(10,0,5000)),
                 UCR = round(runif(10,0,500)),
                 Carmelita= round(runif(10,0,500)),
                 Guadalupe = round(runif(10,0,1500)),
                 Limon = round(runif(10,0,4500))
                 )

df
##    Alajuela Saprissa Cartago Heredia PerezZeledon SanCarlos Grecia UCR
## 1     18083     1122    2236    1122         7062      3113   2184 354
## 2      5481    12295    3145    9546         6282        46   1187  45
## 3     11944     6990    1735    9836         7288        31    740 260
## 4     13073     6203    3191    4738          556      4167   2050  34
## 5      4445    14258    3057    3682         6222      3900    128 245
## 6     17921    10594    2790    8319         5743      4270   3504 383
## 7     14407    15801    2126    9339         4276      1611   1626 165
## 8     11142     4933    4819    7636         6902       704   4789 440
## 9        54    13846    2201    9828         3045      3103   2754 112
## 10    17447     5526    1393    6780         3707       673   1742 313
##    Carmelita Guadalupe Limon
## 1        214      1289  2254
## 2        169      1335  1871
## 3        492      1039  2770
## 4        322       599  1944
## 5        481       217  3093
## 6        340      1330  3332
## 7        192       330  4428
## 8        296       899  1563
## 9        316      1130  1392
## 10       249       316   526
str(df)
## 'data.frame':    10 obs. of  11 variables:
##  $ Alajuela    : num  18083 5481 11944 13073 4445 ...
##  $ Saprissa    : num  1122 12295 6990 6203 14258 ...
##  $ Cartago     : num  2236 3145 1735 3191 3057 ...
##  $ Heredia     : num  1122 9546 9836 4738 3682 ...
##  $ PerezZeledon: num  7062 6282 7288 556 6222 ...
##  $ SanCarlos   : num  3113 46 31 4167 3900 ...
##  $ Grecia      : num  2184 1187 740 2050 128 ...
##  $ UCR         : num  354 45 260 34 245 383 165 440 112 313
##  $ Carmelita   : num  214 169 492 322 481 340 192 296 316 249
##  $ Guadalupe   : num  1289 1335 1039 599 217 ...
##  $ Limon       : num  2254 1871 2770 1944 3093 ...
# Line 1
split_data <- function(df, train = TRUE,percentage){  
# Line 2
  length<- nrow(df) 
 total_row <- length *percentage 
# Line 3
 split <- 1:total_row 
 # Line 4
 if (train == TRUE){ 
   train_df <- df[split, ] 
     return(train_df) 
   } else {
     test_df <- df[-split, ] ## Si es false le genera un objeto con el 20% de los datos del df original.
       return(test_df)
   } 
 }
Train <- split_data(df, 0.8, train = TRUE)

Test <- split_data(df, 0.8, train = FALSE) 
Train
##   Alajuela Saprissa Cartago Heredia PerezZeledon SanCarlos Grecia UCR
## 1    18083     1122    2236    1122         7062      3113   2184 354
## 2     5481    12295    3145    9546         6282        46   1187  45
## 3    11944     6990    1735    9836         7288        31    740 260
## 4    13073     6203    3191    4738          556      4167   2050  34
## 5     4445    14258    3057    3682         6222      3900    128 245
## 6    17921    10594    2790    8319         5743      4270   3504 383
## 7    14407    15801    2126    9339         4276      1611   1626 165
## 8    11142     4933    4819    7636         6902       704   4789 440
##   Carmelita Guadalupe Limon
## 1       214      1289  2254
## 2       169      1335  1871
## 3       492      1039  2770
## 4       322       599  1944
## 5       481       217  3093
## 6       340      1330  3332
## 7       192       330  4428
## 8       296       899  1563
Test
##    Alajuela Saprissa Cartago Heredia PerezZeledon SanCarlos Grecia UCR
## 9        54    13846    2201    9828         3045      3103   2754 112
## 10    17447     5526    1393    6780         3707       673   1742 313
##    Carmelita Guadalupe Limon
## 9        316      1130  1392
## 10       249       316   526

Explicación de cada una de las lineas

Line 1

split_data <- function(df, train = TRUE,percentage)

Se crea un objeto donde se guarda la funcion (split_data); df: Define el dataset; train: especifica si la funcion devuelve el train set o el test set; percentage se usa para guardar el porcentage del dataset que queremos dividir para train/test.

Line 2

length <- nrow(df)

Imprime la cantidad de filas que contiene el data frame

total_row <- lengthpercentage

Imprime el total de filas que va a contener el data frame que va a trabajar el train. Normalmente se divide el 80% de las lineas para train, y 20% para test.

Line 3

split <- 1:total_row

Divide el data frame, seleccionando desde la linea 1 hasta la linea total_row

Line 4

if (train =TRUE) Si train es true le genera un objeto con el 80% de los datos del df original

train_df <- dataframe df[split, ]

Aquí se corrige el nombre de la funcion dataframe por “df” como estaba originalmente al principio, y la guarda en un objeto

return(train_df)

Devuelve el resultado de la funcion

else test_df <- df[-split, ]

Guarda el resto de los datos en un objeto para ser usados por el test set, Si es false le genera un objeto con el 20% de los datos del df original.

return(test_df)

Devuelve y ejecuta el resultado para la funcion test