# Aprende a utilizar el subsetting en R para evitar bucles # Ejercicio 1: Inicializacion al subsetting #### # Crea un vector aleatorio 'v' de 25 componentes en el intervalo [0, 10] # utilizando runif(x, min, max) # Preguntale a R qué elementos son mayores o iguales que 5 utilizando 'v>=5', # Asígnalo a una variable 'w' y ejecuta el programa para que te lo muestre # El comando 'y >= x' computa un vector o matriz con las mismas dimensiones de # 'y' asignando 'TRUE' a los elementos que cumplen la condición (en este caso # ser mayores o iguales a x) y 'FALSE' a los que no lo cumplen. Esto es muy util # porque, internamente, R corre los bucles if{} con la condicion y for{} para # recorrer toda el vector o matriz. # En el calculo numerico, R considera los 'TRUE' como 1 y los 'FALSE' como 0. # Gracias a esto, podemos obtener el numero de elementos que cumplen una # condicion con la funcion sum(). Obten el numero de componentes mayores que # 5 del vector 'v' sumando todas las componentes del vector 'w' (que contiene # tantos TRUE como elementos de 'v' mayores o iguales a 5). Asignalo a 'p'. # Nos estamos ahorrando los contadores en bucles (sum_w <- sum_w + 1) # Hemos obtenido el numero de componentes iguales o mayores que 5 pero ahora # queremos saber el valor numerico de esos elementos. Para ello, en R se puede # utilizar el comando 'v[v>=5]': esto computa los valores de v que obtienen # TRUE al aplicarles la condicion (en este caso, los valores de v mayores o # iguales que 5). Crea un vector 'z' con los elementos mayores o iguales que 5 # del vector 'v' # Ejercicio 2: Asignacion de escanos y ley D'Hondt (practica 5) con subsetting #### # Para entender este ejercicio es necesario haber realizado y comprendido la # practica 5. En vez de crear contadores para iterarar por cada escano (bucle while) # obteniendo cada vez el elemento maximo de la matriz (bucles for e if), vamos # a utilizar subsetting para comparar todos los elementos con el valor minimo # que va a recibir un escano. Posteriormente, vamos a contar por filas (bucle for) # la cantidad de elementos que cumplen la condicion y, por tanto, reciben escano. # Se cuenta por filas porque cada una corresponde a un partido. Empecemos! # Inicializa una funcion 'AsignacionEscanos2' que acepte como argumentos el vector # votos y el numero de escanos en una variable 'nesc'. # Obten el numero de partidos con la longitud del vector 'votos' y asignalo a # 'npart'. Inicializa tambien una matriz A de 0s con tantas columnas como numero # de escanos y tantas filas como numero de partidos. # Inicializa tambien el vector 'Asigna_escan' con tantos 0s como numero de partidos # usando un bucle o la funcion rep(0,npart) # Rellena la matriz A con un bucle for que itere de 1 hasta el numero de escanos # rellenando cada columna de A (A[,i]) con el vector 'votos' dividido por la # iteracion (votos/i). Estamos creando la matriz propia de la ley D'hondt. # Para conocer el valor minimo que va a recibir un escano, piensa en un ejemplo # simple: si se van a asignar 10 escanos, el ultimo valor que recibe escano es # el decimo elemento mayor de la matriz A; es decir, que si convertimos la matriz # A en un vector y lo ordenamos, el ultimo valor que recibe escano se encontrara en # A[10]. Si se asignan 'nesc' escanos, se encontrara en A[nesc]. Vamos alla! # Crea un vector 'a' con todos los valores de 'A' desglosados utilizando la # funcion as.vector: 'a <- as.vector(A)'. Ordena el vector de mayor a menor # utilizando: 'a <- sort(a, decreasing = TRUE)' # Ya sabemos que solo los elementos de 'A' mayores o iguales a 'a[nesc]' recibiran # escano. Sin embargo, hay que saber que el numer de escanos que recibe el # partido 'i' es el numero de elementos mayores que a[nesc] en la fila 'i' de la # matriz 'A'. Se puede proceder de varias maneras, se muestran dos: # METODO 1: Crea una matriz 'B' que asigne TRUE a los elementos mayores o iguales a 'a[nesc]' # de la matriz 'A'. En la resolucion he omitido este paso ya que al aplicar operadores # logicos, R ya crea una matriz de por si. # Inicializa un bucle que itere desde 1 hasta el numero de filas de A (que # equivale al numero de partidos). En el interior, asigna el elemento i del # vector 'Asigna_escan' a la suma de los elementos de la fila i de la matriz # B: 'sum(B[i,])'. YA ESTA! ESE ES TU RESULTADO # METODO 2 (salta este metodo hasta que el anterior funcione): Se puede utilizar # la funcion rowSum() para sumar por filas una matriz. Suma la matriz 'B' # (o 'A >= 5') y asignalo a Asigna_escan). # Con la funcion 'return()', obten el vector Asigna_escan, cierra la funcion # y compruebala con los siguientes datos: nesc=350 votos=c(6752983, 5019869, 3640063, 3097185, 1637540, 869934, 577055, 527375, 377423, 276519, 244754, 226469, 123981, 119597, 98448, 68580, 19696) # Deberias obtener: # 102 76 55 46 24 13 8 7 5 4 3 3 1 1 1 1 0