Capítulo 1 Objetos

En el mundo de la programación, un objeto es como un contenedor que guarda información. Esta información puede ser de diferentes tipos: números, texto, datos complejos, e incluso código. Lo importante es que un objeto agrupa todo lo necesario para representar una entidad o concepto.

En R, prácticamente todo es un objeto. Las variables que usaremos para guardar datos, las funciones que usaremos para procesar esos datos, e incluso los propios datos en sí mismos, son objetos.

1.1 ¿Qué son los objetos en R?

Imagina que estás organizando tu mudanza a Estados Unidos. Cada elemento que empacas en una caja (ropa, libros, electrodomésticos) puede ser considerado un objeto. Cada objeto tiene características que lo definen: un nombre, un tipo, un tamaño, un peso, etc.

En R, los objetos también tienen características que los definen. Estas características se llaman atributos. Algunos atributos comunes son:

  • Nombre: El nombre que le damos al objeto para poder referirnos a él.
  • Tipo: El tipo de dato que contiene el objeto (numérico, carácter, lógico, etc.).
  • Clase: La clase del objeto, que define su estructura y comportamiento (vector, lista, data frame, función, etc.).
  • Longitud: La cantidad de elementos que contiene el objeto (si es un vector, una lista, etc.).

1.1.1 R como un lenguaje orientado a objetos

R es un lenguaje de programación orientado a objetos. Esto significa que se basa en el concepto de objetos para organizar y procesar la información.

La programación orientada a objetos tiene varias ventajas:

  • Modularidad: Los objetos permiten dividir un programa en partes más pequeñas y manejables.
  • Reutilización: Los objetos se pueden reutilizar en diferentes partes del programa o en otros programas.
  • Encapsulación: Los objetos ocultan los detalles de implementación, lo que facilita su uso y mantenimiento.

1.1.2 El poder de la abstracción

El concepto de objeto nos permite abstraer la complejidad del mundo real. En lugar de pensar en los detalles de cómo se almacenan y procesan los datos en la memoria de la computadora, podemos pensar en términos de objetos que representan entidades del mundo real.

Por ejemplo, en lugar de pensar en una serie de números que representan las temperaturas de diferentes ciudades, podemos pensar en un objeto “temperaturas” que contiene toda esa información.

Esta abstracción facilita la comprensión y el manejo de la información, y nos permite concentrarnos en la lógica del problema que queremos resolver.

1.2 Variables: Los primeros objetos en tu viaje

Antes de empezar a empacar para nuestra mudanza a Estados Unidos, necesitamos saber qué cosas nos llevaremos. Cada objeto que decidamos llevar se representa en R como una variable.

Piensa en las variables como etiquetas que ponemos a cada objeto. Por ejemplo, podríamos usar la variable estado para guardar el nombre del estado al que nos mudaremos, o la variable num_maletas para guardar el número de maletas que llevaremos.

1.2.1 Creando variables en R

En R, no necesitamos declarar una variable antes de usarla. Simplemente le asignamos un valor usando el símbolo <-.

Ejemplo:

# Asignar el valor "California" a la variable "estado"
estado <- "California"

# Asignar el valor 5 a la variable "num_maletas"
num_maletas <- 5

Para ver el valor que hemos guardado en una variable, simplemente escribimos su nombre en la consola de RStudio y presionamos Enter.

Ejemplo:

estado <- "California"

estado
#> [1] "California"

Al ejecutar este código, verás que en la consola aparece el valor "California".

1.2.2 Operaciones con variables

También podemos usar variables para realizar operaciones. Por ejemplo, si queremos calcular el costo total de nuestro viaje en avión, podríamos usar las variables precio_boleto y num_personas.

Ejemplo:

precio_boleto <- 300
num_personas <- 4

costo_total <- precio_boleto * num_personas

costo_total
#> [1] 1200

En este ejemplo, primero asignamos valores a las variables precio_boleto y num_personas. Luego, multiplicamos estas variables para calcular el costo_total y mostramos su valor en la consola.

1.2.3 Buenas prácticas para nombrar variables

¡Cuidado con las mayúsculas!

R distingue entre mayúsculas y minúsculas. Si creas una variable llamada estado y luego intentas acceder a ella como Estado, R no la encontrará.

Nombres descriptivos

Es importante usar nombres descriptivos para las variables, que indiquen claramente qué información contienen. En lugar de usar variables como x o y, es mejor usar nombres como precio_boleto o num_maletas.

Reglas para nombrar variables

  • Los nombres de las variables pueden contener letras, números y guiones bajos (_).
  • No pueden empezar con un número.
  • No pueden contener espacios.
  • R distingue entre mayúsculas y minúsculas.

1.2.4 Tipos de datos

Las variables en R pueden contener diferentes tipos de datos:

  • Numéricos: Representan números, como la población de una ciudad o el costo de un boleto de avión.

    poblacion_chicago <- 2700000
    precio_boleto <- 300
  • Caracteres: Representan texto, como el nombre de un estado o una ciudad.

    estado <- "California"
    ciudad <- "Los Ángeles"
  • Lógicos: Representan valores de verdad: TRUE (verdadero) o FALSE (falso). Podríamos usar una variable lógica para indicar si queremos visitar una ciudad o no.

    visitar_chicago <- TRUE
    visitar_miami <- FALSE

1.3 Tipos de objetos para datos complejos

Las variables que hemos visto hasta ahora son muy útiles para guardar información individual, como el nombre de una ciudad o la cantidad de maletas que llevaremos en nuestra mudanza. Sin embargo, en el mundo real, a menudo necesitamos trabajar con conjuntos de datos más complejos.

Imagina que quieres guardar el nombre de todas las ciudades que piensas visitar en tu viaje a Estados Unidos. ¿Tendrías que crear una variable para cada ciudad? ¡Sería muy tedioso!

Afortunadamente, R nos ofrece otros tipos de objetos que nos permiten organizar y manipular información de maneras más eficientes. Veamos algunos de ellos:

1.3.1 Vectores: organizando información del mismo tipo

Los vectores son como trenes que transportan una serie de objetos del mismo tipo. Pueden ser números, texto o valores lógicos, pero todos los elementos de un vector deben ser del mismo tipo. Por ejemplo, podríamos usar un vector para guardar el nombre de cada estado de Estados Unidos, o un vector para guardar la población de cada estado.

Creando vectores: Para crear un vector, podemos usar la función c() (que significa “combinar”) y listar los elementos que queremos incluir, separados por comas.

# Crear un vector con los nombres de algunos estados
estados <- c("California", "Texas", "Florida", "Nueva York")

# Crear un vector con la población de cada estado (en millones)
poblacion <- c(39.2, 29.0, 21.4, 19.4) 

Si queremos saber la cantidad de datos que tiene nuestro vector, su longitud, usaremos la función length(). La función class() nos indica la clase del objeto, es decir, qué tipo de datos contiene.

length(poblacion)  
#> [1] 4
class(estados)     
#> [1] "character"
class(poblacion)   
#> [1] "numeric"

Podemos usar la función names() para asignar nombres a los elementos de un vector. Esto puede ser útil para identificar cada elemento.

names(poblacion) <- estados
poblacion
#> California      Texas    Florida Nueva York 
#>       39.2       29.0       21.4       19.4

Además de c(), existen otras funciones útiles para crear vectores:

  • seq(): Crea una secuencia de números. Podemos especificar el valor inicial, el valor final y el incremento.

    # Crear un vector con los números del 1 al 10
    numeros <- seq(1, 10)
    
    # Crear un vector con los números del 2 al 20, de 2 en 2
    numeros_pares <- seq(2, 20, by = 2)
  • rep(): Repite un valor o un vector un número determinado de veces.

    # Crear un vector con el valor 1 repetido 5 veces
    unos <- rep(1, 5)
    
    # Crear un vector con la secuencia "A", "B" repetida 3 veces
    letras <- rep(c("A", "B"), 3)  # Output: "A" "B" "A" "B" "A" "B"

Accediendo a los elementos de un vector: Cada elemento de un vector tiene una posición, que se indica con un número entre corchetes. El primer elemento está en la posición 1, el segundo en la posición 2, y así sucesivamente.

# Mostrar el primer elemento del vector "estados"
estados[1]  # Output: "California"

# Mostrar el tercer elemento del vector "poblacion"
poblacion[3]  # Output: 21.4

También podemos acceder a varios elementos a la vez usando el operador :. Por ejemplo, para acceder a los elementos del segundo al cuarto del vector estados:

estados[2:4]
#> [1] "Texas"      "Florida"    "Nueva York"

Operaciones con vectores: Podemos realizar operaciones matemáticas con vectores numéricos. Por ejemplo, si queremos calcular la población total de los cuatro estados, podemos usar el operador + para sumar los elementos del vector poblacion.

poblacion <- c(39.2, 29.0, 21.4, 19.4) 

poblacion[1] + poblacion[2] + poblacion[3] + poblacion[4]  
#> [1] 109

Si queremos realizar la misma operación de forma más concisa, R nos permite sumar todos los elementos de un vector directamente:

poblacion <- c(39.2, 29.0, 21.4, 19.4) 

sum(poblacion)  
#> [1] 109

R también nos ofrece otras herramientas para realizar operaciones con vectores. Por ejemplo, si queremos calcular la raíz cuadrada de la población de cada estado:

sqrt(poblacion)  
#> [1] 6.260990 5.385165 4.626013 4.404543

En este caso, la función sqrt() calcula la raíz cuadrada de cada elemento del vector poblacion de forma individual. Esto es posible gracias a que muchas funciones en R están vectorizadas, lo que significa que pueden operar directamente sobre vectores, elemento por elemento. Las funciones vectorizadas son muy eficientes, ya que evitan la necesidad de escribir bucles para procesar cada elemento del vector por separado. Más adelante exploraremos con mayor profundidad las funciones en R y cómo utilizarlas para realizar análisis de datos más complejos.

Coerción de vectores: A diferencia de otros lenguajes de programación, R intenta interpretar o cambiar un valor cuando encuentra un error. Por ejemplo, si intentamos convertir un vector de caracteres a numérico, R convertirá los elementos que pueda y reemplazará los que no pueda por NA.

ejemplo <- c("3", "b", "6", "a", "puente", "4")
as.numeric(ejemplo)
#> Warning: NAs introduced by coercion
#> [1]  3 NA  6 NA NA  4

Ordenamiento de vectores: Podemos ordenar los elementos de un vector usando la función sort().

distritos <- c("Comas", "Lince", "Miraflores", "Lurigancho", "Chorrillos")
sort(distritos) 
#> [1] "Chorrillos" "Comas"      "Lince"      "Lurigancho" "Miraflores"

También podemos ordenar un vector usando sus índices con la función order(). De esta forma, obtenemos un vector con las posiciones que ocuparían los elementos del vector original si estuvieran ordenados. Esto puede ser útil cuando queremos ordenar un vector en base a otro vector o cuando queremos preservar el vector original sin modificarlo.

indices <- order(distritos)  # Output: 5 1 2 4 3
distritos[indices]
#> [1] "Chorrillos" "Comas"      "Lince"      "Lurigancho" "Miraflores"

NA en vectores: Si un vector contiene valores NA, algunas operaciones pueden devolver NA. Podemos usar la función is.na() para identificar los valores NA y filtrarlos.

ejemplo_na <- c(28, 3, 19, NA, 89, 45, NA, 86, 5, 18, 28, NA)
ejemplo_sin_na <- ejemplo_na[!is.na(ejemplo_na)]
mean(ejemplo_sin_na)  # Output: 38.66667
#> [1] 35.66667

1.3.2 Listas: agrupando objetos de diferentes tipos

Las listas son como contenedores que pueden guardar diferentes tipos de objetos. Imagina una caja donde puedes guardar ropa, libros, herramientas, y cualquier otro objeto que necesites. En R, las listas te permiten agrupar información diversa en un solo objeto.

Creando listas: Para crear una lista, usamos la función list() y especificamos los elementos que queremos incluir, separados por comas. Cada elemento puede tener un nombre, que se indica con el símbolo =.

# Crear una lista con información sobre una ciudad
ciudad_info <- list(nombre = "San Francisco", 
                    poblacion = 880000, 
                    costo_vida = 3.8, 
                    clima = "Templado")

Accediendo a los elementos de una lista: Para acceder a los elementos de una lista, podemos usar sus nombres o sus posiciones.

# Acceder al elemento "nombre" de la lista "ciudad_info"
ciudad_info$nombre  # Output: "San Francisco"

# Acceder al segundo elemento de la lista "ciudad_info"
ciudad_info[[2]]  # Output: 880000

1.3.3 Matrices: organizando datos en filas y columnas

Las matrices son como tablas que organizan la información en filas y columnas. Todos los elementos de una matriz deben ser del mismo tipo.

Creando matrices: Para crear una matriz, usamos la función matrix(). Debemos especificar los datos que queremos incluir, el número de filas (nrow) y el número de columnas (ncol).

# Crear una matriz con las distancias entre ciudades (en millas)
distancias_ciudades <- matrix(c(0, 2600, 2100, 950, 
                                2600, 0, 1100, 2700, 
                                2100, 1100, 0, 2100, 
                                950, 2700, 2100, 0), 
                              nrow = 4, ncol = 4)
distancias_ciudades
#>      [,1] [,2] [,3] [,4]
#> [1,]    0 2600 2100  950
#> [2,] 2600    0 1100 2700
#> [3,] 2100 1100    0 2100
#> [4,]  950 2700 2100    0

Accediendo a los elementos de una matriz: Para acceder a los elementos de una matriz, usamos corchetes y especificamos la fila y la columna del elemento que queremos.

# Acceder al elemento en la fila 1, columna 3 de la matriz "distancias_ciudades"
distancias_ciudades[1, 3] 
#> [1] 2100

1.3.4 Arrays: matrices multidimensionales

Los arrays son como matrices que tienen más de dos dimensiones. Imagina una matriz que, además de filas y columnas, tiene profundidad. En R, los arrays te permiten organizar datos en estructuras más complejas.

Creando arrays: Para crear un array, usamos la función array().

# Crear un array con las temperaturas máximas y mínimas de 
# tres ciudades durante los meses de verano (junio, julio, agosto)
temperaturas <- array(c(25, 28, 30, 22, 25, 28,  # Ciudad 1
                        28, 20, 32, 25, 18, 30,  # Ciudad 2
                        22, 25, 28, 18, 23, 25), # Ciudad 3
                      dim = c(3, 2, 3))  # 3 ciudades, 2 temperaturas (max/min), 3 meses
temperaturas
#> , , 1
#> 
#>      [,1] [,2]
#> [1,]   25   22
#> [2,]   28   25
#> [3,]   30   28
#> 
#> , , 2
#> 
#>      [,1] [,2]
#> [1,]   28   25
#> [2,]   20   18
#> [3,]   32   30
#> 
#> , , 3
#> 
#>      [,1] [,2]
#> [1,]   22   18
#> [2,]   25   23
#> [3,]   28   25

Accediendo a los elementos de un array: Para acceder a los elementos de un array, usamos corchetes y especificamos la posición del elemento en cada dimensión.

# Acceder a la temperatura máxima de la ciudad 2 en julio
temperaturas[2, 1, 2] 
#> [1] 20

1.3.5 Factores: representando datos categóricos

Los factores son un tipo especial de objeto que se usa para representar datos categóricos, es decir, datos que se pueden clasificar en grupos. Por ejemplo, el tipo de clima (“cálido”, “templado”, “frío”), la región de un país (“norte”, “sur”, “este”, “oeste”), o el tipo de vivienda (“casa”, “apartamento”).

Creando factores: Para crear un factor, usamos la función factor().

# Crear un factor con los tipos de clima de diferentes ciudades
tipos_clima <- factor(c("Templado", "Cálido", "Frío"))

Niveles de un factor: Los diferentes valores que puede tomar un factor se llaman niveles. En el ejemplo anterior, los niveles del factor tipos_clima son “Templado”, “Cálido” y “Frío”.

Utilidad de los factores: Los factores son muy útiles para el análisis de datos, ya que permiten agrupar y comparar información de manera eficiente. Por ejemplo, podríamos usar el factor tipos_clima para analizar cómo varía el costo de vida en ciudades con diferentes climas.

1.4 El Universo de los Objetos en R

A lo largo de este capítulo, hemos explorado los diferentes tipos de objetos que habitan el universo de R. Desde las variables más simples hasta los arrays multidimensionales, cada objeto tiene un papel importante en la construcción de nuestros análisis de datos.

1.4.1 Filosofía de los objetos en R

En R, todo es un objeto. Esta filosofía tiene profundas implicaciones en la forma en que se escribe y se ejecuta el código. Al tratar todo como un objeto, R promueve la consistencia, la modularidad y la reutilización.

Los objetos nos permiten encapsular la información y el comportamiento, lo que facilita la organización y el mantenimiento del código. Además, la capacidad de crear nuestros propios objetos nos da un gran poder para modelar y resolver problemas complejos.

Al comprender la filosofía de los objetos en R, podemos aprovechar al máximo las capacidades del lenguaje para el análisis de datos.

1.4.2 Comparación con otros lenguajes

Si bien muchos lenguajes de programación modernos utilizan el paradigma de la orientación a objetos, R tiene un enfoque particular. En lenguajes como Python o Java, la creación de clases y objetos es una parte fundamental del lenguaje. En R, si bien es posible crear clases y objetos, el lenguaje se centra más en el uso de funciones para manipular y transformar datos.

Esta diferencia se debe en parte a la historia de R como un lenguaje para el análisis estadístico. En este contexto, las funciones son una herramienta natural para realizar cálculos y análisis.

1.5 Ejercicios

Ahora que ya conoces los diferentes tipos de objetos en R, es hora de poner a prueba tus conocimientos.

  1. Crea las siguientes variables:
  • nombre_ciudad: Almacena el nombre de la ciudad de Estados Unidos a la que te gustaría mudarte.
  • poblacion: Almacena la población de esa ciudad (puedes buscarla en internet).
  • distancia: Almacena la distancia en kilómetros desde tu ciudad actual hasta la ciudad de Estados Unidos.
  • quiero_vivir_alli: Almacena un valor lógico (TRUE o FALSE) que indique si realmente te gustaría vivir en esa ciudad.
Solución
nombre_ciudad <- "Seattle"
poblacion <- 724745 
distancia <- 8340  # Distancia aproximada desde Lima, Perú
quiero_vivir_alli <- TRUE
  1. Crea un vector llamado ciudades_cercanas que contenga los nombres de tres ciudades cercanas a la ciudad que elegiste en el ejercicio anterior.
Solución
ciudades_cercanas <- c("Tacoma", "Bellevue", "Everett")
  1. Crea una lista llamada mi_lista que contenga los siguientes elementos:
  • Tu nombre.
  • Tu edad.
  • Un vector con los nombres de tus tres colores favoritos.
  • Un valor lógico que indique si te gusta el chocolate.
Solución
mi_lista <- list(nombre = "Ana", 
                 edad = 30, 
                 colores_favoritos = c("azul", "verde", "rojo"), 
                 me_gusta_el_chocolate = TRUE)
  1. Crea una matriz llamada gastos_mensuales que contenga tus gastos mensuales estimados en las siguientes categorías:
Categoría Enero Febrero Marzo
Vivienda
Transporte
Alimentación
Entretenimiento

Completa la matriz con valores numéricos.

Solución
gastos_mensuales <- matrix(c(1500, 1500, 1500,  # Vivienda
                             300,  250,  350,   # Transporte
                             500,  400,  550,   # Alimentación
                             200,  150,  250),  # Entretenimiento
                           nrow = 4, ncol = 3,
                           dimnames = list(c("Vivienda", "Transporte", "Alimentación", "Entretenimiento"),
                                           c("Enero", "Febrero", "Marzo")))
  1. Crea un factor llamado tipos_clima que contenga los nombres de los diferentes tipos de clima en Estados Unidos (puedes usar “Templado”, “Cálido”, “Frío”, etc.). Asigna etiquetas a los niveles del factor para que sean más descriptivos (por ejemplo, “Clima cálido”, “Clima templado”, etc.).
Solución
tipos_clima <- factor(c("Templado", "Cálido", "Frío", "Cálido", "Templado"),
                     levels = c("Frío", "Templado", "Cálido"),
                     labels = c("Clima frío", "Clima templado", "Clima cálido"))

tipos_clima
  1. Crea un vector llamado ciudades_visitar con los nombres de 5 ciudades que te gustaría visitar en Estados Unidos. Luego, crea otro vector llamado dias_por_ciudad con la cantidad de días que te gustaría pasar en cada ciudad. Finalmente, crea un tercer vector llamado costo_diario con el costo estimado por día en cada ciudad (en dólares).
Solución
ciudades_visitar <- c("Nueva York", "Los Ángeles", "Chicago", "San Francisco", "Miami")
dias_por_ciudad <- c(5, 4, 3, 6, 2)  
costo_diario <- c(200, 180, 150, 220, 170)
  1. Crea un vector llamado temperaturas_maximas con las temperaturas máximas promedio (en grados Celsius) de las ciudades que quieres visitar durante el mes de julio. Luego, crea un vector llamado temperaturas_minimas con las temperaturas mínimas promedio. Finalmente, crea una matriz que contenga estos dos vectores como columnas, y nombra las filas con los nombres de las ciudades.
Solución
temperaturas_maximas <- c(29, 28, 27, 22, 31)  # Temperaturas máximas en julio
temperaturas_minimas <- c(21, 18, 19, 15, 25)  # Temperaturas mínimas en julio

# Crear la matriz
temperaturas <- matrix(c(temperaturas_maximas, temperaturas_minimas), nrow = 5, ncol = 2,
                       dimnames = list(ciudades_visitar, c("Máxima", "Mínima")))

temperaturas
#>               Máxima Mínima
#> Nueva York        29     21
#> Los Ángeles       28     18
#> Chicago           27     19
#> San Francisco     22     15
#> Miami             31     25
  1. Crea un array tridimensional que contenga información sobre el clima de las ciudades que quieres visitar. La primera dimensión debe representar las ciudades, la segunda dimensión debe representar los meses del año (“Enero”, “Febrero”, …, “Diciembre”), y la tercera dimensión debe representar dos variables: “Temperatura” y “Precipitación”. Puedes usar valores ficticios para llenar el array.
Solución
# Crear un array con dimensiones 5 ciudades x 12 meses x 2 variables
clima <- array(dim = c(5, 12, 2),
               dimnames = list(ciudades_visitar,
                               month.name,
                               c("Temperatura", "Precipitación")))

# Llenar el array con valores ficticios (ejemplo)
clima[,, "Temperatura"] <- sample(10:35, 60, replace = TRUE)  # Temperaturas entre 10 y 35 grados
clima[,, "Precipitación"] <- sample(0:100, 60, replace = TRUE)  # Precipitación entre 0 y 100 mm

clima
#> , , Temperatura
#> 
#>               January February March April May June July August September
#> Nueva York         26       10    33    19  19   14   15     17        14
#> Los Ángeles        19       32    34    27  21   30   31     10        21
#> Chicago            14       18    34    15  21   15   28     21        34
#> San Francisco      14       27    15    18  22   20   17     24        21
#> Miami              25       11    32    33  20   24   20     28        17
#>               October November December
#> Nueva York         19       24       13
#> Los Ángeles        20       26       28
#> Chicago            17       13       35
#> San Francisco      16       25       20
#> Miami              27       31       32
#> 
#> , , Precipitación
#> 
#>               January February March April May June July August September
#> Nueva York         50       26     6    44  36   35   85     81        41
#> Los Ángeles        68        4     2    51 100   59   14     56        18
#> Chicago            55       96    63    18  87   35   91     89        15
#> San Francisco      22       29    30    50  53   67   61     59        83
#> Miami              77       11    31    16  53   43    6     54        46
#>               October November December
#> Nueva York         97       68       96
#> Los Ángeles        46       45        5
#> Chicago            97       28       75
#> San Francisco      46        5       30
#> Miami              74       25       12
  1. Imagina que tienes un vector con las temperaturas máximas de cada día de un año en una ciudad de Estados Unidos. Crea un programa que, utilizando únicamente los conceptos aprendidos en este capítulo (variables, vectores, matrices, arrays y factores), identifique la racha más larga de días consecutivos con temperaturas máximas por encima de un valor umbral dado (por ejemplo, 25 grados Celsius).
Solución

Este ejercicio requiere un manejo eficiente de vectores y una lógica algorítmica para identificar la racha más larga. Aquí te presento una posible solución:

# Crear un vector con temperaturas máximas ficticias para un año
temperaturas <- sample(10:35, 365, replace = TRUE)

# Definir el umbral de temperatura
umbral <- 25

# Crear un vector lógico que indique si la temperatura supera el umbral
dias_calurosos <- temperaturas > umbral

# Inicializar variables para rastrear la racha más larga
racha_actual <- 0
racha_mas_larga <- 0
inicio_racha_mas_larga <- 0

# Recorrer el vector de días calurosos
for (i in 1:length(dias_calurosos)) {
  if (dias_calurosos[i]) {
    racha_actual <- racha_actual + 1
  } else {
    if (racha_actual > racha_mas_larga) {
      racha_mas_larga <- racha_actual
      inicio_racha_mas_larga <- i - racha_actual
    }
    racha_actual <- 0
  }
}

# Mostrar la racha más larga y su posición
cat("La racha más larga de días calurosos es:", racha_mas_larga, "\n")
#> La racha más larga de días calurosos es: 5
cat("Comienza en el día:", inicio_racha_mas_larga, "\n")
#> Comienza en el día: 199

Este código utiliza un bucle for para recorrer el vector de días calurosos y dos variables (racha_actual y racha_mas_larga) para rastrear la racha más larga.

  1. Imagina que tienes un vector con los precios diarios de las acciones de una empresa durante un año. Crea un programa que, utilizando únicamente los conceptos aprendidos en este capítulo, determine el período de tiempo en el que podrías haber comprado y vendido las acciones para obtener la máxima ganancia. Asume que solo puedes comprar y vender una vez.
Solución

Este ejercicio es una variante del problema clásico de “maximizar ganancias en la bolsa”. Resolverlo de manera óptima puede ser complejo, pero con los conceptos del capítulo 1, podemos crear un algoritmo que encuentre una solución (aunque no necesariamente la óptima).

# Crear un vector con precios de acciones ficticios para un año
precios <- sample(50:150, 365, replace = TRUE)

# Inicializar variables para rastrear la máxima ganancia
max_ganancia <- 0
dia_compra <- 1
dia_venta <- 1

# Recorrer el vector de precios
for (i in 1:(length(precios) - 1)) {
  for (j in (i + 1):length(precios)) {
    ganancia <- precios[j] - precios[i]
    if (ganancia > max_ganancia) {
      max_ganancia <- ganancia
      dia_compra <- i
      dia_venta <- j
    }
  }
}

# Mostrar la máxima ganancia y los días de compra y venta
cat("Máxima ganancia:", max_ganancia, "\n")
#> Máxima ganancia: 100
cat("Día de compra:", dia_compra, "\n")
#> Día de compra: 21
cat("Día de venta:", dia_venta, "\n")
#> Día de venta: 196
Este código utiliza dos bucles for anidados para comparar todos los posibles pares de días de compra y venta.