Chapter 7 Ciclos en R
7.1 Ciclos for
en R
Los ciclos for
en R permiten repetir una serie de instrucciones para un conjunto de elementos. Esto es útil cuando se desea realizar una operación varias veces sin tener que escribir el mismo código repetidamente. El ciclo for
sigue la siguiente estructura:
Donde variable
toma, en cada iteración, el valor de cada elemento en la secuencia. La secuencia puede ser un vector, lista o cualquier conjunto de elementos.
7.1.1 Ejemplo básico
Supongamos que queremos imprimir los números del 1 al 5. Podemos hacerlo con un ciclo for como sigue:
## [1] 1
## [1] 2
## [1] 3
## [1] 4
## [1] 5
Esto dará como resultado:
Explicación:
i
: es la variable que toma los valores del 1 al 5.print(i)
: imprime el valor dei
en cada iteración.
7.1.2 Ejemplo 2: Sumar los elementos de un vector
Ahora, vamos a sumar los elementos de un vector usando un ciclo for
:
## [1] 24
Resultado:
Explicación:
- Iniciamos la variable
suma
en 0. - En cada iteración, el valor de
i
se suma asuma
, acumulando el resultado.
7.1.3 Ejemplo 3: Multiplicar cada elemento de un vector por 2
Podemos usar un ciclo for para modificar un vector, multiplicando cada uno de sus elementos por 2:
## [1] 2 4 6 8 10
Resultado:
Explicación:
- Usamos 1:length(
vector
) para iterar sobre los índices del vector. - En cada iteración, el valor correspondiente del vector se multiplica por 2.
7.1.4 Ejemplo 4: Iterar sobre un dataframe
Supongamos que tenemos un dataframe con datos biológicos y queremos iterar sobre cada fila para hacer cálculos.
# Creamos un dataframe de ejemplo
df <- data.frame(muestra = c("A", "B", "C"),
conteo_celular = c(100, 200, 150),
temperatura = c(37, 25, 30))
for (i in 1:nrow(df)) {
print(paste("Muestra:", df$muestra[i],
"- Conteo celular:", df$conteo_celular[i]))
}
## [1] "Muestra: A - Conteo celular: 100"
## [1] "Muestra: B - Conteo celular: 200"
## [1] "Muestra: C - Conteo celular: 150"
Resultado:
7.1.5 Ejercicios resueltos
7.1.5.1 Ejercicio 1: Sumar los cuadrados de los primeros 5 números
Escribe un ciclo for que sume los cuadrados de los números del 1 al 5.
## [1] 55
Resultado:
7.1.6 Ejercicios propuestos
- Ejercicio 1: Calcular el factorial de un número
Escribe un ciclo for que calcule el factorial de un número. Por ejemplo, si el número es 5, el resultado debe ser 5! = 5 * 4 * 3 * 2 * 1.
- Ejercicio 2: Encontrar el valor máximo en un vector
Dado un vector de números, escribe un ciclo for que encuentre el valor máximo.
- Ejercicio 3: Contar los números mayores a 50
Dado el siguiente vector c(12, 45, 67, 34, 89, 23, 56), escribe un ciclo for que cuente cuántos números son mayores a 50.
- Ejercicio 4: Imprimir los nombres de las muestras con conteo celular mayor a 150
Dado el siguiente dataframe:
Escribe un ciclo for que imprima el nombre de las muestras cuyo conteo celular sea mayor a 150.
- Ejercicio 5: Calcular la media de cada fila en un dataframe
Dado el siguiente dataframe que representa los resultados de varios ensayos en diferentes condiciones:
df <- data.frame(ensayo1 = c(2.5, 3.1, 4.7),
ensayo2 = c(3.5, 2.9, 4.2),
ensayo3 = c(4.1, 3.8, 4.5))
Escribe un ciclo for que calcule la media de los valores de cada fila.
7.2 Ciclos while
en R
El bucle while
se utiliza en situaciones donde no sabemos de antemano cuántas veces se repetirá una operación, a diferencia del bucle for
, que itera un número conocido de veces.
7.2.1 Sintaxis
while (condición) {
# Bloque de código
# Ejecuta TODO lo que está dientro
# MIENTRAS la condicón sea VERDADERA
}
- condición: Es una expresión lógica que debe evaluarse como verdadera (TRUE) para que el bucle continúe ejecutándose.
- bloque de código: Es el conjunto de instrucciones que se ejecutan en cada iteración del bucle.
Ejemplo básico
Vamos a ver un ejemplo básico para entender cómo funciona el bucle while
en R. En este caso, el bucle continuará ejecutándose hasta que el valor de x sea mayor que 5.
## [1] 1
## [1] 2
## [1] 3
## [1] 4
## [1] 5
El resultado será:
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
7.2.1.1 Ejemplo 1: Suma de números enteros
Escribe un programa que sume todos los números enteros desde 1 hasta que la suma total supere 1000. Imprime el número de iteraciones necesarias y el valor de la suma final.
suma <- 0
contador <- 1
while (suma <= 1000) {
suma <- suma + contador
contador <- contador + 1
}
cat("Número de iteraciones:", contador - 1, "\n")
## Número de iteraciones: 45
## Suma total: 1035
7.2.1.2 Ejemplo 2: Secuencia de Fibonacci
Genera los primeros 10 términos de la secuencia de Fibonacci utilizando un bucle while. La secuencia de Fibonacci comienza con 0 y 1, y cada número posterior es la suma de los dos anteriores.
## Secuencia de Fibonacci:
## 0
## 1
## 1
## 2
## 3
## 5
## 8
## 13
## 21
## 34
7.2.1.3 Ejemplo 3: Factorial de un número
Escribe un programa que calcule el factorial de un número entero dado. El factorial de un número n es el producto de todos los números enteros positivos menores o iguales a n
n <- 6
factorial <- 1
contador <- 1
while (contador <= n) {
factorial <- factorial * contador
contador <- contador + 1
}
cat("Factorial de", n, "es:", factorial, "\n")
## Factorial de 6 es: 720
7.2.1.4 Ejemplo 4: Aproximación de \(\pi\) mediante series
Utiliza la serie de Leibniz para calcular una aproximación de \(\pi\). La serie de Leibniz es: \[\pi=4( 1- \frac{1}{3} +\frac{1}{5} -\frac{1}{7} +\frac{1}{9} + \ldots )\]
Escribe un programa que continúe sumando términos de la serie hasta que la diferencia entre dos aproximaciones sucesivas de \(\pi\) sea menor que \(10^{-6}\)
pi_aprox <- 0
tolerancia <- 1e-6
diferencia <- 1
contador <- 0
signo <- 1
while (diferencia > tolerancia) {
nueva_aprox <- pi_aprox + signo * (4 / (2 * contador + 1))
diferencia <- abs(nueva_aprox - pi_aprox)
pi_aprox <- nueva_aprox
signo <- -signo
contador <- contador + 1
}
cat("Aproximación de pi:", pi_aprox, "\n")
## Aproximación de pi: 3.141593
## Número de iteraciones: 2000001
7.2.1.5 Ejemplo 5: Encontrar la raíz cuadrada de un número usando el método de bisección
Escribe un programa que calcule la raíz cuadrada de un número positivo \(x\) utilizando el método de bisección. El método de bisección consiste en encontrar un número \(y\) tal que \(y^2=x\) dentro de un intervalo \([0, x]\).
x <- 25
tol <- 1e-6
low <- 0
high <- x
guess <- (low + high) / 2
while (abs(guess^2 - x) > tol) {
if (guess^2 < x) {
low <- guess
} else {
high <- guess
}
guess <- (low + high) / 2
}
cat("La raíz cuadrada aproximada de", x, "es:", guess, "\n")
## La raíz cuadrada aproximada de 25 es: 5
Ejercicio 1: Crecimiento bacteriano simple
Imagina que estamos monitoreando el crecimiento de una colonia de bacterias en un medio de cultivo. El número de bacterias se duplica cada hora. Partimos con 100 bacterias y queremos saber cuántas horas pasará hasta que la colonia tenga más de 10,000 bacterias.
bacterias <- 100
horas <- 0
while (bacterias <= 10000) {
bacterias <- bacterias * 2
horas <- horas + 1
}
cat("Número de horas:", horas)
## Número de horas: 7
Explicación:
- Comenzamos con 100 bacterias y un contador de horas igual a 0.
- En cada iteración, el número de bacterias se duplica y se incrementa el contador de horas en 1.
- El ciclo se detiene cuando la población de bacterias supera las 10,000.
Ejercicio 2: Tasa de mortalidad bacteriana
Ahora supongamos que estamos observando una colonia de bacterias que se reduce en un 20% cada hora debido a la falta de nutrientes. Comenzamos con 500 bacterias y queremos saber cuántas horas pasará hasta que la población bacteriana baje de 50 bacterias.
bacterias <- 500
horas <- 0
while (bacterias >= 50) {
bacterias <- bacterias * 0.8 # reducción del 20%
horas <- horas + 1
}
cat("Número de horas:", horas)
## Número de horas: 11
Explicación:
- El número de bacterias disminuye un 20% en cada iteración.
- El bucle se detiene cuando la población cae por debajo de 50.
Ejercicio 3: Ciclos de infección viral
Un virus infecta una célula y produce nuevas partículas virales. Cada partícula puede infectar nuevas células, y el ciclo se repite. Si comenzamos con 1,000 partículas virales y cada ciclo de infección produce 50 nuevas partículas por partícula viral, ¿cuántos ciclos de infección se necesitarán para alcanzar 1,000,000 de partículas virales?
Solución:
particulas <- 1000
ciclos <- 0
while (particulas < 1000000) {
particulas <- particulas * 50
ciclos <- ciclos + 1
}
cat("Número de ciclos de infección:", ciclos)
## Número de ciclos de infección: 2
Explicación:
- En cada ciclo de infección, el número de partículas virales se multiplica por 50.
- El ciclo se detiene cuando el número de partículas supera 1,000,000.
7.2.1.6 Ejercicios sugeridos
- Ejercicio 1: Producción de antibióticos
Un microorganismo es capaz de producir antibióticos en condiciones de laboratorio. Se mide la cantidad de antibiótico en el medio cada hora. Inicialmente, hay 0.5 mg de antibiótico, y la producción se incrementa en 10% cada hora. Escribe un bucle while que determine cuántas horas tomará para alcanzar una concentración de 10 mg de antibiótico.
- Ejercicio 2: Decaimiento de una toxina
Una toxina producida por bacterias tiene un periodo de vida media de 3 horas, lo que significa que se reduce a la mitad cada 3 horas. Si hay inicialmente 80 mg de toxina en el medio, ¿cuántas horas tomarán hasta que la cantidad de toxina sea menor de 1 mg?
- Ejercicio 3: Reproducción bacteriana con nutrientes limitados Una población de bacterias crece en un medio con nutrientes limitados. La tasa de crecimiento es inicialmente del 50% por hora, pero disminuye en un 10% en cada iteración debido a la reducción de los nutrientes. Parte de una población de 200 bacterias y determina cuántas iteraciones tomará para que la población supere las 500 bacterias.