PracticaFuncionesR

Author

Universidad de Costa Rica

Instrucciones

Desarrolle los pasos necesarios para dar solución a cada uno de los siguientes planteamientos.

Casos Analíticos

Para cada uno de los siguientes casos o situaciones desarrolle una función en R.

Caso 1: Sumando números

Construir una función que reciba dos números y que entregue la suma de estos números, llame a la función como sumarNumeros

sumarNumeros<-function(a,b){
  
  sum<-a+b
  
  return(sum)
  
}

# Pruebas de la funcion

sumarNumeros(1,1)
[1] 2
sumarNumeros(-1,1)
[1] 0
sumarNumeros(-2,-3)
[1] -5

Caso 2: suma hasta…

Construir una función que genere números aleatorios entre cero y uno hasta que la suma de éstos números supere por primera vez el valor de 3. La función debe entregar el vector de números aleatorios generados hasta que se cumpla la condición. Llame a la funcion sumarHasta.

sumarHasta<-function(){
  
  rand<-runif(100,min=0,max=1)
  
  rand_acum<-cumsum(rand)
  
  v1<-rand_acum[rand_acum<=3]
  
  v2<-rand[1:length(v1)]
  
  return(v2)
  
}

# Pruebas de la funcion

sumarHasta()
[1] 0.7299239 0.6004541 0.1586488 0.8610108

Caso 3: Sumar Hasta Cota

Construir una función que, dado un número entero positivo (cota) ingresado por el usuario, genere números aleatorios entre cero y uno hasta que la suma de los números generados exceda por primera vez la cota. La función debe entregar una lista de salidas: un vector con los números aleatorios, la suma y la cantidad de números aleatorios hasta la cota. Si el usuario no ingresa el valor de la cota, se debe asumir igual a 1. Llame a la funcion sumarHastaCota.

sumarHastaCota<-function(cota=1){
  
  rand<-runif(100,min=0,max=1)
  
  rand_acum<-cumsum(rand)
  
  v1<-rand_acum[rand_acum<=cota]
  
  v2<-rand[1:length(v1)]
  
  lista<-list(vector=v2, 
              suma=sum(v2), 
              cantidad=length(v2))
  
  return(lista)
  
}

# Pruebas de la funcion

sumarHastaCota() # Sin colocar cota
$vector
[1] 0.2662128 0.1015702 0.1454171

$suma
[1] 0.5132001

$cantidad
[1] 3
sumarHastaCota(5) # Cota de 5
$vector
[1] 0.886988146 0.166569347 0.700948673 0.824167100 0.001444523 0.920518427
[7] 0.530960559 0.939432041

$suma
[1] 4.971029

$cantidad
[1] 8

Caso 4:

Construya una función que reciba dos números de la recta real y que entregue el punto medio de estos números. El resultado debe ser un mensaje por pantalla. Llame a la función como calcularMediaRecta.

calcularMediaRecta<-function(a,b){
  
  mid<-a+(b-a)/2 # (a+b)/2
  
  texto<-paste0("El punto medio de [",a,",",b,"] es: ",mid)
  
  return(texto)
  
}

# Pruebas de la funcion

calcularMediaRecta(2,5)
[1] "El punto medio de [2,5] es: 3.5"

Caso 5: Numero Mayor

Construya una función que reciba dos números reales a y b, la función debe decir cuál es el mayor de ellos. Llame a la funcion calcularMayor.

calcularMayor<-function(a,b){
  
  if(a>b){
    
    return(a)
    
  }else{
    
    return(b)
    
  }
  
}

# Pruebas de la funcion

calcularMayor(5,3)
[1] 5
calcularMayor(3,3)
[1] 3
calcularMayor(3,5)
[1] 5
calcularMayor(-3,-5)
[1] -3

Su turno

Construir funciones en R que realicen lo solicitado.

  1. Construya una función que reciba dos números reales a y b, la función debe decir cuál es el mayor de ellos, llame a la función calcularMayor. Realice los siguientes ejercicios empleando dicha función:

    • El mayor entre 2 y 3.

    • El mayor entre -1 y 0

    • El mayor entre 1 y 1

    • El mayor entre TRUE y FALSE

    • El mayor entre “hola” y 5 (prepare siempre modulo de seguridad a fallos).

  2. Escriba una función llamada calcularMedia que calcule la media muestral de un vector numérico x ingresado a la función. A continuación la fórmula para calcular la media muestral.

\(\bar x=\sum_{i=1}^n\frac{x_i}{n}\)

Nota: no puede usar la función mean( ).

Empleando la funcion anterior, calcule la media de:

  • Del vector de ingresos rgamma(1000,2,1), con semilla aleatoria 123

  • Del vector \(y\), que se obtiene de \(y=x^2\) en un dominio \([1,4]\) (evalue 100 valores de \(x\) en dicho dominio.

  • Del vector de precios de diamantes del dataset diamonds del paquete ggplot

  1. Construya una función con nombre calcularRaices que encuentre las raíces reales de una ecuación de segundo grado. El usuario debe suministrar los coeficientes a, b y c de la ecuación \(ax^2+bx+c=0\) y la función debe retornar:
    1. Las raíces de la ecuacion.

De solución a las siguientes ecuaciones:

  • \(x^2=4\)

  • \(x(x+2)=-1\)

  • \(x^2-7x-18=0\)

  • \(x^2+1=0\)

  1. Construya una funcion de nombre cambiarUnidadesLongitud, en la que se reciba un valor numerico, una unidad del sistema de medida de Longitud inicial y una unidad del sistema de medida de Longitud final (deseada a transformar), debe retornar un valor numerico. Por ejemplo: Suponga que se busca transformar 3 m a dam (metros a decametros). Tome de referencia la siguiente tabla:

Realice las siguientes conversiones:

  • 1283 mm a dm

  • 1.2 hm a dm

  • 0.072 km a cm

  • 1.79 m a cm

  • 1 dam a m

  1. Construya una funcion de nombre cambiarUnidadesTiempo, en la que se reciba un valor numerico, una unidad del sistema de medida de Tiempo inicial y una unidad del sistema de medida de Tiempo final (deseada a transformar), debe retornar un valor numerico. Por ejemplo: Suponga que se busca transformar 10 min a s (minutos a segundo). Tome de referencia la siguiente tabla:

Realice las siguientes conversiones:

  • 1 dia a minutos

  • 1.5 años a horas

  • 12896 segundos a horas

  • 18 horas a dias

  • 1.89 meses a segundos

  1. Escribir una función de nombre calcularFisicas que calcule la velocidad de un proyectil dado que el usuario ingresa la distancia recorrida en alguna unidad de distancia (Km, Hm, …) y el tiempo necesario en alguna unidad de tiempo (segundos, min, horas). El resultado se debe expresar en metros/segundo con el valor hallado y las unidades a modo texto (ejemplo: 3 m/s), recuerde que

\[ velocidad = \frac{distancia}{tiempo} \]

Sugerencia: para transformar unidades, puede hacer uso de las funciones de cambiar unidades calculadas previamente.

  • Calcule la velocidad de un proyectil que recorrió 12.8 km en 1.3 mins

  • Calcule la velocidad de un proyectil que recorrió 987 dam en 0.035 horas.

  1. Escribir una función de nombre intercambiarValores que reciba dos valores \(a\) y \(b\) y que los intercambie. Es decir, si ingresa \(a=4\) y \(b=9\) que la función retorne \(a=9\) y \(b=4\), debe mostrar el resultado a modo texto empleando notación de coordenadas, por ejemplo: T(a,b) = (b,a) . Genere los siguientes intercambios o transformaciones:
  • \(x=3, y=-1\)

  • \(x=y+1, y=3\)

  1. Considere una hora expresada en forma de tripleta (hh:mm:ss). Escribir una funcion con nombre calcularHoraDespues que reciba los valores en horas, minutos y segundos de una momento de interes por el usuario y un valor numerico, el cual representara la cantidad de segundos posteriores a la hora dada, debe retornar el valor de la hora final al cabo de \(T\) segundos en forma de tripleta. Por ejemplo, para la entrada (13:43:24) al cabo de 10 segundos, se tiene que devolver (13:43:34).

Para la hora inicial 16:08:31, determine la hora al cabo de:

  • 22 segundos

  • 129 segundos

  • 500 segundos

  • 4220 segundos

  1. Construya una función llamada precio que calcule el precio total de sacar A fotocopias y B impresiones, sabiendo que los precios son 50 y 100 pesos para A y B respectivamente si el cliente es un estudiante, y de 75 y 150 para A y B si el cliente es un profesor. La función debe tener dos argumentos cuantitativos (A y B) y el argumento lógico estudiante que por defecto tenga el valor de TRUE. Use la estructura mostrada abajo.
precio <- function(A, B, estudiante=TRUE) {
  ...
  ...
  ...
  return(precio_total)
}

Determine el precio final en cada escenario presentado:

  • Un estudiante decide sacar 12 copias y 7 impresiones.

  • Un profesor decide sacar 12 copias y 7 impresiones.

  • Un profesor decide sacar 15 impresiones.

  • Un estudiante decide sacar 26 copias.

  1. Construya una función llamada salario que le ingrese el salario por hora y el número de horas trabajadas durante una semana por un trabajador. La función debe calcular el salario neto semanal, teniendo en cuenta que si el número de horas trabajadas durante la semana es mayor de 48, esas horas de demás se consideran horas extras y tienen un 35% de recargo. Imprima el salario neto. Use la estructura mostrada abajo.
salario <- function(num.horas, valor_hora) {
  ...
  ...
  ...
  return(salario_neto)
}

Retorne el salario neto devengado por cada uno de los siguientes funcionarios:

  • Funcionario A: recibe salario por hora de $12 y esta semana trabajó 48 horas.

  • Funcionario B: recibe salario por hora de $8 y esta semana trabajó 60 horas.

  • Funcionario C: recibe salario por hora de $25 y esta semana trabajó 38 horas.

  1. Construya una función llamada nota que calcule la nota obtenida por un alumno en una evaluación de tres puntos cuya ponderación o importancia son 20%, 30% y 50% para los puntos I, II y III respectivamente. La función debe retornar una lista con la nota obtenida y el resultado obtenido, el cual es un mensaje sobre si el estudiante aprobó la evaluación o no (Aprueba, No Aprueba), aprueba si la nota es mayor a 70. El usuario debe ingresar las notas individuales de los tres puntos y la función debe entregar la nota final de la evaluación. Use la estructura mostrada abajo.
nota <- function(p1, p2, p3) {
  ...
  ...
  ...
}

Obtenga la nota y resultado para cada estudiante dadas las tripletas:

  • (82, 44, 70)

  • (40,50, 80)

  • (20, 70, 90)

  • (100, 100, 10)

  1. Escriba una función llamada minimo que permita obtener el valor mínimo de un vector numérico. No puede usar ninguna de las funciones básicas de R como which.min(), which.max(), order(), min( ), max( ), sort( ) u order( ). Use la estructura mostrada abajo.
minimo <- function(x) {
  ...
  ...
  return(minimo)
}

Suponga un vector de cantidad de clientes atendidos en una hora por un mismo cajero durante 10 dias (suponga misma hora de antencion, de 8 am a 9 am): 4, 5, 3, 7, 5, 5, 3, 2, 8, 3

  1. Construya una función de nombre calcularPuntoMedio que calcule las coordenadas del punto medio \(M\) entre dos puntos \(A\) y \(B\). Opcional: haga que la funcion retorne el grafico con los puntos dados y el punto medio de ellos. Vea la siguiente figura para una ilustración. ¿Cuáles cree usted que deben ser los parámetros de entrada de la función?

Calcule el punto medio de los dos puntos dados en cada situacion:

  • \(P(1,1)\) y \(Q(2,2)\)

  • \(P(-1,1)\) y \(Q(-2,-2)\)

  • \(P(0,0)\) y \(Q(3,2)\)

  • \(P(1,0)\) y \(Q(3,0)\)

  1. Realiza una función que se llame calcularAbsoluto que reciba como parámetro un número y devuelva su valor absoluto. Nota: en R existe una versión más general de esta función llamada abs (no la utilice para construir la funcion indicada, pero si para comprobar con los casos de testeo). Empleando las funciones calcularAbsoluto y abs obtenga los resultados para cada escenario:
  • -3

  • 25

  • -1.2

  • 1.2

  1. Escribe una función que se llame getPositivosNegativos, la cual reciba un vector de números y retorne una lista con los elementos positivos y los elementos negativos del vector. Genere un vector normal estandar con 125 observaciones, extraiga el vector de valores positivos y negativos (fije semilla aleatoria en 123).

  2. Realiza una versión de la función sign, llamela calcularSigno. Esta función recibe un vector numérico y devuelve un vector del mismo tamaño que el vector original, pero con los valores 1 (valores positivos), 0 (valores 0) y -1 (valores negativos). Por ejemplo, sign(c(-4, 2, 0, 3)) devuelve el vector c(-1, 1, 0, 1). Aplique la función calcularSigno para el vector generado en el ejercicio 16.

  3. Realiza una versión de la función any, llamela any2 que recibe como parámetro un vector de valores lógicos y devuelve un valor lógico indicando si al menos uno de los elementos del vector es TRUE. Pruebe el uso de ambas funciones sobre los siguientes vectores booleanos:

  • [T,F,T,T,T,F,F,T]

  • [F,F,F,F,F,F,F]

Donde \(T:\) es verdadero y \(F:\) es falso.

  1. R contiene una serie de funciones que implementan las operaciones entre conjuntos: unión, intersección, diferencia e igualdad:
x <- c(1, 2, 5)
y <- c(5, 6, 1, 3)
union(x, y)      # unión
## [1] 1 2 5 6 3
intersect(x, y)  # intersección
## [1] 1 5
setdiff(x, y)    # Diferencia: elementos de x que no están en y  
## [1] 2
setdiff(y, x)
## [1] 6 3
setequal(x, y)   # igualdad
## [1] FALSE
setequal(x, c(5, 2, 1))
## [1] TRUE

Implementa versiones de estas funciones y testee con los valores dados de \(x\) e \(y\). Sugerencia: en la implementación puedes usar el operador %in% que comprueba si un elemento está en un vector, vea el siguiente ejemplo:

2 %in% x
## [1] TRUE
c(2, 4) %in% x
## [1]  TRUE FALSE
  1. Siguiendo con el ejercicio previo, implementa una función de nombre getConjuntos que calcule si un conjunto es un subconjunto de otro (es subconjunto, no es subconjunto y que calcule la diferencia simétrica, es decir, aquellos elementos que pertenecen a uno de los conjuntos, pero no a ambos a la vez, debe retornar a modo lista con el mensaje de pertencia y el vector de la diferencia simetrica.

Determine para cada uno de los siguientes escenarios, si dados dos conjuntos \(A\) y \(B\), uno es subconjunto de otro y por ende su diferencia simetrica:

  • A={1,2,3} y B={1,2,3,4,5}

  • A={1,3,5,7} y B={0,2,4,6,8}

  1. Escribe una función con nombre hallarValor que dado un valor y un vector devuelva cuántas veces se encuentra el valor en el vector. Compruebe la funcion en la que se intente dar respuesta a: cuantas veces aparece el cero en el vector \(v=(0,1,1,0,1,0,0,0,1,0,1,0,0,1)\)

  2. Una matriz es simétrica si es cuadrada y es igual a su traspuesta. Escribe una función con nombre esCuadrada que devuelva un valor lógico indicando si una matriz es simétrica.

Compruebe si las siguientes matrices son simetricas o no:

  1. Escribe una función con nombre getTimeStage que recibe como parámetro una matriz. La matriz representa los tiempos empleados por un ciclista en varias etapas. Cada fila representa una etapa. La primera columna de la matriz almacena el número de horas, la segunda columna el número de minutos y la tercera columna el número de segundos que tardó en completar la etapa. Por ejemplo, si se recibe la matriz:

\[ \begin{equation} \begin{pmatrix} 2 & 30 & 50\\ 1 & 55 & 20 \end{pmatrix} \end{equation} \]

El ciclista ha completado dos etapas. En la primera etapa ha tardado 2 horas, 30 minutos y 50 segundos. La función debe devolver una lista con el número total de horas, minutos y segundos empleados por el ciclista en cubrir el total de etapas. Para los datos de ejemplo se devolvería 4 horas, 26 minutos y 10 segundos.

Considere los tiempos de Vingegaard en las primeras 5 etapas del tour de francia:

  • Etapa 1: 2 h; 27 min; 38 segundos

  • Etapa 2: 1 h; 54 min; 01 segundos

  • Etapa 3: 3 h; 18 min; 44 segundos

  • Etapa 4: 0 h; 35 min; 19 segundos

  • Etapa 5: 1 h; 55 min; 55 segundos

Devuelva el total de horas acumuladas en las primeras 5 etapas.

  1. Realiza un programa que permita gestionar las reservas de una sala de cine para una sesión. La sala tiene 9 filas con 9 asientos por fila. Los asientos se numeran del 11 al 19 para la primera fila, del 21 al 29 para la segunda fila y así sucesivamente. La sala puede representarse como una matriz. Crea las siguientes funciones:
  • Función que inicie la matriz. Inicialmente todos los asientos deben estar libres.

  • Función que muestre en la pantalla la ocupación de la sala.

  • Función que devuelva cuántos asientos libres hay en la sala.

  • Función que dado un número de entradas devuelva un vector con los números de las filas en que existe, como mínimo, ese número de asientos libres.

  • Función que dado un número de fila y un entero positivo \(n\) reserve \(n\)asientos en la fila especificada. Devuelve un vector con los números de los asientos reservados. Puedes suponer que el número de fila es correcto y que la fila contiene esa cantidad de asientos libres.

  • Función que dado un entero positivo \(n\) reserve \(n\) asientos en la sala. Si no existen \(n\) asientos en la sala no se debe reservar ninguno. Devuelve un vector con los números de los asientos reservados.

Escribe un programa que solicite cantidades de entradas. Si la cantidad de entradas es mayor a la cantidad de asientos libres indíquelo en la pantalla. Si es menor o igual reserve esas entradas. Proceda solicitando cantidades de entradas y reservando hasta que no haya entradas libres en la sala o se introduzca una cantidad de entradas negativa. Reserve entradas de la siguiente forma:

  • Si es posible albergar todas las entradas en la misma fila, reserve la fila de mayor numeración con capacidad para albergar el número de entradas solicitadas.

  • En otro caso obtenga los asientos de cualquier lugar disponible.

Cada vez que se reserven entradas muestre los números de entradas reservadas y la ocupación global de la sala. Por ejemplo:

1: L L L L L L L L L
2: L L L L L L L L L
3: L L L L L L L L L
4: L L L L L L L L L
5: L L L L L L L L L
6: L L L L L L L L L
7: L L L L L L L L L
8: L L L L L L L L L
9: L L L L L L L L L

Cantidad de entradas: 8
Asientos reservados: [91, 92, 93, 94, 95, 96, 97, 98]

1: L L L L L L L L L
2: L L L L L L L L L
3: L L L L L L L L L
4: L L L L L L L L L
5: L L L L L L L L L
6: L L L L L L L L L
7: L L L L L L L L L
8: L L L L L L L L L
9: O O O O O O O O L

Cantidad de entradas: 11
Asientos reservados: [99, 81, 82, 83, 84, 85, 86, 87, 88, 89, 71]

1: L L L L L L L L L
2: L L L L L L L L L
3: L L L L L L L L L
4: L L L L L L L L L
5: L L L L L L L L L
6: L L L L L L L L L
7: O L L L L L L L L
8: O O O O O O O O O
9: O O O O O O O O O

Cantidad de entradas: