# Instalación de paquetes 
install.packages("readr")
## Installing package into '/cloud/lib/x86_64-pc-linux-gnu-library/4.5'
## (as 'lib' is unspecified)
install.packages("dplyr")
## Installing package into '/cloud/lib/x86_64-pc-linux-gnu-library/4.5'
## (as 'lib' is unspecified)
install.packages("tidyr")
## Installing package into '/cloud/lib/x86_64-pc-linux-gnu-library/4.5'
## (as 'lib' is unspecified)
install.packages("networkD3")
## Installing package into '/cloud/lib/x86_64-pc-linux-gnu-library/4.5'
## (as 'lib' is unspecified)
# Carga de librerías
library(readr)
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(tidyr)
library(networkD3)
energia <- read_csv("owid-energy-data.csv")
## Rows: 23232 Columns: 130
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr   (2): country, iso_code
## dbl (128): year, population, gdp, biofuel_cons_change_pct, biofuel_cons_chan...
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
# 2. Filtro solo España en año 2022
energia_filtrada <- energia |>
  filter(country == "Spain", year == 2022)

# 3. Selecciono solo las fuentes de electricidad con el operador OR 
energia_reducida <- energia_filtrada |>
  select(
    coal_electricity,
    gas_electricity,
    oil_electricity,
    nuclear_electricity,
    hydro_electricity,
    solar_electricity,
    wind_electricity
  )

Como los gráficos sankey necesitan una estructura que sea tipo origen / objetivo / Valor procedo a hacer unas transformaciones en el que todo origen de fuente acaba siendo electricidad y los valores de cada uno de ellos.

# 4. Convierto datos a formato largo (necesario para Sankey), con pivot longer puedo transformar datos de formato ancho (wide) a formato largo (long) o a mi imagen y semejanza, por ejemplo:
energia_sankey <- energia_reducida |>
  pivot_longer(
    cols = everything(), # Aqui convierto todas las columnas en filas
    names_to = "source", # La columna original pasa a ser llamada Source u el origen.
    values_to = "value"  # El valor de cada celda pasa a una nueva columna llamada value que será el peso o                           magnitud del flujo
  ) |>
  mutate(target = "Electricity") # Añado una columna mas que es el destino u objetivo, en mi caso, la electricidad.

Finalmente puedo hacer una visualización con el paquete networkD3 mencionado en videos y del cual hay ejemplos y guia de utilización.

https://cran.r-project.org/web/packages/networkD3/readme/README.html

# Primero creo una lista única de todos los nodos que aparecerán en el diagrama, donde indico el origen y destino de cada conexión, y elimino duplicados con unique.
nodes <- data.frame(name = unique(c(energia_sankey$source, energia_sankey$target)))

# Aqui voy a proceder a preparar los enlaces, con mutate como siempre creo o modifico columnas, con match devuelvo la posición de cada valor de origen en el nobre del nodo y resto menos 1 para que cuente bien desde el 0
links <- energia_sankey |>
  mutate(
    source = match(source, nodes$name) - 1,
    target = match(target, nodes$name) - 1
  )

# Finalemnte la nomenclatura 
sankeyNetwork(
  Links = links,
  Nodes = nodes,
  Source = "source",
  Target = "target",
  Value = "value",
  NodeID = "name"
)
## Links is a tbl_df. Converting to a plain data frame.