27 dic 2023

Exportar a Excel múltiples data frame de manera simultanea en R

En el siguiente ejemplo mostramos como exportar multiples data frame a Excel de forma simultanea en R. Primero segmentamos la base de datos en varios datos.

iris_setosa <- iris[iris$Species == "setosa",]
iris_setosa <- iris[iris$Species == "versicolor",]
iris_setosa <- iris[iris$Species == "virginica",]

Primero creamos una función que exporta un data frame a R. Teniendo el nombre de la base de datos en formato texto, creamos el nombre con el que vamos a exportar el archivo (que es el mismo nombre del objeto que vamos a exportar: paste0(objeto, ".xlsx")). Posteriormente, exportamos este archico a Excel usando la función write_xlsx del paquete writexl.

exportar_a_excel <- function(objeto) {
  nombre_archivo <- paste0(objeto, ".xlsx")
  writexl::write_xlsx(get(objeto), nombre_archivo)
}

Finalmente, usamos el paquete purr y su función map para aplicar la función que acabamos de crear para múltiples objetos. Primero creamos un vector de caracteres con todos los objetos cuyo nombre inicien con “iris_”, y posteriormente aplicamos la función exportar_a_excel, usando la función map.

library(purrr)
library(writexl)
 
objetos_result <- ls(pattern = "^iris_")
map(objetos_result, exportar_a_excel)

25 oct 2023

Una rápida introducción a la gestión de base de datos con dplyr en 10 minutos

Aquí proponemos una pequeña base de datos, para introducir el uso de dplyr como herramienta de gestión de base de datos en R.

data1 <- data.frame(
  id = 1:8,
  edad = c(8,9,12,22,14,17,22,16),
  mujer = c(T,T,F,F,F,T,T,F),
  prov = c("azua","azua","azua","Bani","Bani","Ocoa","Bani","Ocoa"),
  nota = c(60,70,71,82,92,80,95,72),
  nota2 = c(60,70,71,82,92,80,95,72),
  carrera = c("Ecn","Ing","Ecn","Ing","Ecn","Ing","Ecn","Ing")
)
 
data1
  id edad mujer prov nota nota2 carrera
1  1    8  TRUE azua   60    60     Ecn
2  2    9  TRUE azua   70    70     Ing
3  3   12 FALSE azua   71    71     Ecn
4  4   22 FALSE Bani   82    82     Ing
5  5   14 FALSE Bani   92    92     Ecn
6  6   17  TRUE Ocoa   80    80     Ing
7  7   22  TRUE Bani   95    95     Ecn
8  8   16 FALSE Ocoa   72    72     Ing

Con el siguiente ejemplo solo queremos ilustrar que dplyr es una alternativa a las operaciones tradicionales con R:

Nota promedio

Base de R

mean(nota[prov %in% c("Bani","Ocoa")])

[1] 84.2

Paquete dplyr

 Library(tidyverse)
 
data1 |>
  dplyr::filter(prov %in% c("Bani","Ocoa")) |>
  summarise(mean(nota))
   mean(nota)
1       84.2

1. Select. Permite seleccionar columnas o variables de una base de datos. De la base anterior, usamos select para seleccionar las columnas id y edad. Note que se usa dplyr::select, para especificar de que paquete deseamos usar la función select, dado que existen varios paquetes con funciones de este nombre.

data1 |>
  dplyr::select(id,edad)
  id edad
1  1    8
2  2    9
3  3   12
4  4   22
5  5   14
6  6   17
7  7   22
8  8   16

2. filter. Condicionar las observaciones deseadas. Es un filtro al permitir discriminar entre observaciones en función del cumplimiento de alguna condición de las mismas. En el ejemplo siguiente usamos select para elegir todas las variables (everything), y posteriormente filtramos para solo acceder a las personas con calificación mayor a 69.

 data1 |>
  dplyr::select(everything()) |>
  dplyr::filter(nota > 69)
  id edad mujer prov nota nota2 carrera
1  2    9  TRUE azua   70    70     Ing
2  3   12 FALSE azua   71    71     Ecn
3  4   22 FALSE Bani   82    82     Ing
4  5   14 FALSE Bani   92    92     Ecn
5  6   17  TRUE Ocoa   80    80     Ing
6  7   22  TRUE Bani   95    95     Ecn
7  8   16 FALSE Ocoa   72    72     Ing

3. mutate. Se crea para crear una variable o crear una variable nueva. En este sentido podemos usar los operadores de R para crear las variables que entendamos. Por ejemplo, ahora creamos la variable edad al 2.

 data1 |>
  dplyr::select(everything()) |>
  dplyr::filter(nota > 69) |>
  mutate(Edad2 = edad^2)
  id edad mujer prov nota nota2 carrera Edad2
1  2    9  TRUE azua   70    70     Ing    81
2  3   12 FALSE azua   71    71     Ecn   144
3  4   22 FALSE Bani   82    82     Ing   484
4  5   14 FALSE Bani   92    92     Ecn   196
5  6   17  TRUE Ocoa   80    80     Ing   289
6  7   22  TRUE Bani   95    95     Ecn   484
7  8   16 FALSE Ocoa   72    72     Ing   256

4. summarise. Permite crear un resumen de la base de datos, análisis condicional. Por ejemplo, sacamos las notas promedio por carrera. Note que ahora debemos indicar cual es la función de agregación de las variables.

data1 |>
  dplyr::select(everything()) |>
  dplyr::filter(nota > 69) |>
  group_by(carrera) |>
  summarise(mean(nota))
 
# A tibble: 2 x 2
  carrera `mean(nota)`
  <chr>          <dbl>
1 Ecn               86
2 Ing               76

Podemos agregar múltiples capas en group_by:

data1 |>
  dplyr::select(everything()) |>
  dplyr::filter(nota > 69) |>
  group_by(carrera, prov) |>
  summarise(promedio = mean(nota))
 
`summarise()` has grouped output by 'carrera'. You can override using the `.groups` argument.
# A tibble: 5 x 3
# Groups:   carrera [2]
  carrera prov  promedio
  <chr>   <chr>    <dbl>
1 Ecn     azua      71 
2 Ecn     Bani      93.5
3 Ing     azua      70 
4 Ing     Bani      82 
5 Ing     Ocoa      76

5. Cambiar la estructura de una base de datos. Por el formato wide:

data1 |>
  dplyr::select(id,prov,starts_with("nota"))
 
  id prov nota nota2
1  1 azua   60    60
2  2 azua   70    70
3  3 azua   71    71
4  4 Bani   82    82
5  5 Bani   92    92
6  6 Ocoa   80    80
7  7 Bani   95    95
8  8 Ocoa   72    72

Ahora, la base anterior la transformamos en formato long.

data1 |>
  dplyr::select(id,starts_with("nota")) |>
  pivot_longer(cols = !id, names_to='asigna', values_to='valor')
 
# A tibble: 16 x 3
      id asigna valor
   <int> <chr>  <dbl>
 1     1 nota      60
 2     1 nota2     60
 3     2 nota      70
 4     2 nota2     70
 5     3 nota      71
 6     3 nota2     71
 7     4 nota      82
 8     4 nota2     82
 9     5 nota      92
10     5 nota2     92
11     6 nota      80
12     6 nota2     80
13     7 nota      95
14     7 nota2     95
15     8 nota      72
16     8 nota2     72

6. Arrange. Organizar la base de datos. En este caso, organizamos la base de datos en función del valor de una o múltiples variable.

 data_long <- data1 |>
  dplyr::select(id,starts_with("nota")) |>
  pivot_longer(cols = !id, names_to='asigna', values_to='valor') |>
  arrange(desc(asigna))
 
data_long
 
# A tibble: 16 x 3
      id asigna valor
   <int> <chr>  <dbl>
 1     1 nota2     60
 2     2 nota2     70
 3     3 nota2     71
 4     4 nota2     82
 5     5 nota2     92
 6     6 nota2     80
 7     7 nota2     95
 8     8 nota2     72
 9     1 nota      60
10     2 nota      70
11     3 nota      71
12     4 nota      82
13     5 nota      92
14     6 nota      80
15     7 nota      95
16     8 nota      72

 7. inner. Permite combinar información de distintas bases relacionadas.

 inner_join(data_long, data1, by = "id")  |>
  dplyr::select(-starts_with("nota"))
 
# A tibble: 16 x 7
      id asigna valor  edad mujer prov  carrera
   <int> <chr>  <dbl> <dbl> <lgl> <chr> <chr> 
 1     1 nota2     60     8 TRUE  azua  Ecn   
 2     2 nota2     70     9 TRUE  azua  Ing   
 3     3 nota2     71    12 FALSE azua  Ecn   
 4     4 nota2     82    22 FALSE Bani  Ing   
 5     5 nota2     92    14 FALSE Bani  Ecn   
 6     6 nota2     80    17 TRUE  Ocoa  Ing   
 7     7 nota2     95    22 TRUE  Bani  Ecn   
 8     8 nota2     72    16 FALSE Ocoa  Ing   
 9     1 nota      60     8 TRUE  azua  Ecn   
10     2 nota      70     9 TRUE  azua  Ing   
11     3 nota      71    12 FALSE azua  Ecn   
12     4 nota      82    22 FALSE Bani  Ing   
13     5 nota      92    14 FALSE Bani  Ecn   
14     6 nota      80    17 TRUE  Ocoa  Ing   
15     7 nota      95    22 TRUE  Bani  Ecn   
16     8 nota      72    16 FALSE Ocoa  Ing

26 sept 2023

Modelo de Oferta y Demanda en Matlab

Syms es una función que se utiliza para declarar símbolos o variables simbólicas. Estos símbolos no tienen un valor numérico asignado de forma predeterminada, en contraste con las variables normales en MATLAB que almacenan valores numéricos. En su lugar, los símbolos se utilizan para realizar cálculos simbólicos, como álgebra simbólica, cálculo, manipulación de expresiones matemáticas y resolución de ecuaciones simbólicas.

syms x
ezplot(x^2 - x*1.5, [-2 2])

Puedes utilizar syms en MATLAB para simular las curvas de oferta y demanda mediante ecuaciones simbólicas y luego graficar los resultados. Definiendo con syms las variables del modelo, posteriormente necesitamos definir las expresiones que definen las curvas de oferta y demanda y resolver el sistema de ecuaciones (solve). Posteriormente se utiliza la función subs, que permite remplazar valores dentro de una expresión simbólica. Es decir, dentro de la función demanda, podemos recuperar los valores para el precio de demanda que corresponden a cada una de las cantidades demandadas[1].

 syms P Q
 
oferta = 1.2*Q + 5;
demanda = 10 - 0.45*Q;
 
equilibrio = solve(oferta == demanda, [P, Q]);
 
Q_values = linspace(0, 10, 100); % Valores de Q para el gráfico
 
oferta_values = subs(oferta, Q, Q_values);
demanda_values = subs(demanda, Q, Q_values);

Finalmente, se grafican los resultados. Teniendo en cuenta que, en MATLAB, se utiliza el comando figure antes de crear un gráfico para crear una nueva ventana de figura o lienzo de dibujo en la que se mostrará el gráfico. Esto es útil cuando deseas tener múltiples gráficos en ventanas separadas o cuando deseas personalizar aspectos específicos de la figura, como su tamaño o propiedades. Hold on permite anexar series a un mismo gráfico, como múltiples layers en el caso de ggplot2 para los usuarios de R. Finalmente, se agregan las etiquetas y las opciones sobre formato del gráfico.

figure;
plot(Q_values, oferta_values, 'b', 'LineWidth', 2);
hold on;
plot(Q_values, demanda_values, 'r', 'LineWidth', 2);
scatter(equilibrio.Q, equilibrio.P, 100, 'k', 'filled'); % Punto de equilibrio
xlabel('Cantidad (Q)');
ylabel('Precio (P)');
title('Curvas de Oferta y Demanda');
legend('Oferta', 'Demanda', 'Equilibrio', 'Location','best');
grid on;


[1] syms x y
 
expr = x^2 + y;
valor_x = 3;
valor_y = 4;
 
resultado = subs(expr, [x, y], [valor_x, valor_y]);

18 ago 2023

Gghighlight en R: gráfico de series temporales

En la siguiente entrada mostraremos algunos ejemplos de cómo usar la función gghighlight para resaltar alguna serie en R. para el siguiente ejemplo usamos la base EuStockMarkets disponible en la base de R. En primer lugar, obtenemos una base tipo long, donde cada columna de las variables la colocamos una debajo de otra, mientras que el nombre de las variables la colocamos en una nueva variable llamada stock. Adicionalmente, repetimos la secuencia de fechas.

library(tidyverse)
library(tidyr)

# Cargar los datos EuStockMarkets
data("EuStockMarkets")

# Convertir los datos a formato largo
eu_stocks_long <- EuStockMarkets |>
  as.data.frame() |>
  mutate(fecha = time(EuStockMarkets)) |>
  pivot_longer(cols = -fecha, names_to = "stock", values_to = "value")

eu_stocks_long |>  head()

## # A tibble: 6 x 3
##   fecha stock value
##   <dbl> <chr> <dbl>
## 1 1991.
DAX   1629.
## 2 1991. SMI   1678.
## 3 1991. CAC   1773.
## 4 1991. FTSE  2444.
## 5 1992. DAX   1614.
## 6 1992. SMI   1688.

Ahora usamos ggplot para graficar las fechas. Note que ordenar la base en esta secuencia permite usar la función group by de dplyr para realizar estimaciones por serie como si fuera por variable.

 ggplot(eu_stocks_long, aes(x = fecha, y = value, color = stock)) +
  geom_line() +
  labs(title = "Series de EuStockMarkets, datos diario 1991-1998",
       x = "Fecha", y = "Precion (t)", color = "Acción") +
  theme_classic() +
  theme(legend.position = "top", legend.title = element_blank())

Resaltar series con gghighlight

El paquete gghighlight de R permite resaltar una variable basada en una determinada condición. En este primer ejemplo solo resaltamos la serie “DAX”.

library(gghighlight)

 ggplot(eu_stocks_long, aes(x = fecha, y = value, color = stock)) +
   geom_line() +
   labs(title = "Series de EuStockMarkets, datos diario 1991-1998",
        x = "Fecha", y = "Precion (t)", color = "Acción") +
   gghighlight(stock == "DAX") +
   theme_classic() +
   theme(legend.position = "top", legend.title = element_blank())


En caso de querer resaltar dos series podemos usar el operador contenido en %in%. Por ejemplo: stock %in% c(“DAX”,“CAC”).

ggplot(eu_stocks_long, aes(x = fecha, y = value, color = stock)) +
   geom_line() +
   labs(title = "Series de EuStockMarkets, datos diario 1991-1998",
        x = "Fecha", y = "Precion (t)", color = "Acción") +
   gghighlight(stock %in% c("DAX","CAC")) +
   theme_classic() +
   theme(legend.position = "top", legend.title = element_blank())

Igual podemos indicar mediante negación cuales series no quisiéramos aparezcan usando el operador de negación del operador contenido en %!in%:

`%!in%` = Negate(`%in%`)

ggplot(eu_stocks_long, aes(x = fecha, y = value, color = stock)) +
   geom_line() +
   labs(title = "Series de EuStockMarkets, datos diario 1991-1998",
        x = "Fecha", y = "Precion (t)", color = "Acción") +
   gghighlight(stock %!in% c("DAX","CAC")) +
   theme_classic() +
   theme(legend.position = "top", legend.title = element_blank())


Además del nombre, podemos resaltar series que cumplan determinada condición económica.

ggplot(eu_stocks_long, aes(x = fecha, y = value, color = stock)) +
   geom_line() +
   labs(title = "Series de EuStockMarkets, datos diario 1991-1998",
        x = "Fecha", y = "Precion (t)", color = "Acción") +
   gghighlight(max(value) > 8000) +
   theme_classic() +
   theme(legend.position = "top", legend.title = element_blank())


Formato de las líneas no resaltadas

el argumento use direct label evita que la etiqueta de las series resaltadas aparezca al final del gráfico. Además, unhighlighted params permite modificar las características de las series que no son resaltadas.

ggplot(eu_stocks_long, aes(x = fecha, y = value, color = stock)) +
   geom_line(linewidth = 1.3, col = "darkred") +
   labs(title = "Series de EuStockMarkets, datos diario 1991-1998",
        x = "Fecha", y = "Precion (t)", color = "Acción") +
   gghighlight(max(value) > 8000,
               use_direct_label = FALSE,
               unhighlighted_params = list(linewidth = 0.5, colour = alpha("blue", 0.4))) +
   theme_classic() +
   theme(legend.position = "top", legend.title = element_blank())

Podemos segmentar el grágico para cada una de las series identificadas.

ggplot(eu_stocks_long, aes(x = fecha, y = value, color = stock)) +
   geom_line(linewidth = 1.3) +
   labs(title = "Series de EuStockMarkets, datos diario 1991-1998",
        x = "Fecha", y = "Precion (t)", color = "Acción") +
   gghighlight(stock %!in% c("DAX","CAC"),
               use_direct_label = FALSE,
               unhighlighted_params = list(linewidth = 0.5, colour = alpha("blue", 0.4))) +
   theme_classic() +
   theme(legend.position = "top", legend.title = element_blank()) +
  facet_grid(~ stock)



Exportar a Excel múltiples data frame de manera simultanea en R

En el siguiente ejemplo mostramos como exportar multiples data frame a Excel de forma simultanea en R. Primero segmentamos la base de datos ...