Mostrando entradas con la etiqueta merge. Mostrar todas las entradas
Mostrando entradas con la etiqueta merge. Mostrar todas las entradas

2019-08-04

How to do cross join in R?

Problem

We want to calculate a cross join, the Cartesian product of rows from tables —or elements of a vector— in the join. In other words, we want to combine each row from the first table with each row from the second table.

Solution

Two vectors

  • expand.grid
  • expand.grid(1:5, 1:5)
    
  • merge
  • merge(1:5, 1:5)
    
  • Cross join with sqldf
  • library(sqldf)
    df1 <- data.frame(a = 1:5)
    df2 <- df1
    sqldf("SELECT df1.a, df2.a FROM df1 
          CROSS JOIN df2")
    
  • Results
  •    x y
    1  1 1
    2  2 1
    3  3 1
    4  4 1
    5  5 1
    6  1 2
    7  2 2
    8  3 2
    9  4 2
    10 5 2
    11 1 3
    12 2 3
    13 3 3
    14 4 3
    15 5 3
    16 1 4
    17 2 4
    18 3 4
    19 4 4
    20 5 4
    21 1 5
    22 2 5
    23 3 5
    24 4 5
    25 5 5
    
More than two vectors

  • expand.grid.
  • a <- c('europe', 'asia')
    b <- c('co2', 'temperature')
    c <- c('min', 'max')
    expand.grid(a, b, c)
    
        Var1        Var2 Var3
    1 europe         co2  min
    2   asia         co2  min
    3 europe temperature  min
    4   asia temperature  min
    5 europe         co2  max
    6   asia         co2  max
    7 europe temperature  max
    8   asia temperature  max
    

References

2019-01-02

Representar shapefiles (SHP) con ggplot2

Problema

Deseamos representar shapefiles (SHP) con ggplot2. Obtendremos los datos de las regiones administratitvas siguiendo los pasos de esta entrada.

Solución

Voy a representar los municipios de España. Generaré unos datos aleatorios para cada uno de ellos y asignarles luego una escala continua. Creo dos gráficos separados para península y Baleares, y Canarias para ganar en claridad. Finalmente represento Castilla-La Mancha, y dejo un enlace a un pdf para poder hacer zoom en el resto de la península y Baleares y apreciar el detalle.

library(tidyverse)
library(raster)
shp <- getData("GADM", country = "ES", level = 4)
shp.pen <- shp[shp@data$NAME_1 != "Islas Canarias", ]
shp.can <- shp[shp@data$NAME_1 == "Islas Canarias", ]

# Convertimos shapefiles a data frames
df.spain <- fortify(shp, region = "NAME_4")
df.pen <- fortify(shp.pen, region = "NAME_4")
df.can <- fortify(shp.can, region = "NAME_4")

# Datos aleatorios
set.seed(2015)
random.df <- data.frame(id = unique(df.spain[, 'id']),
                        random = runif(
                          n = length(unique(df.spain[, 'id'])),
                          min = 25,
                          max = 75
                        ))
df.pen <-
  merge(df.pen, random.df, by = 'id', all.x = TRUE)
df.can <-
  merge(df.can, random.df, by = 'id', all.x = TRUE)

# Gráficos con ggplot2
# Península y Baleares
p.pen <-
  ggplot(df.pen, aes(x = long, y = lat, group = group)) +
  geom_polygon(aes(fill = random), colour = "white", size = 0.1) +
  labs(x = " ", y = " ") +
  theme_bw() +
  scale_fill_viridis_c('Datos aleatorios', option = "magma", direction = -1) +
  coord_map() +
  theme(
    panel.grid.minor = element_blank(),
    panel.grid.major = element_blank(),
    panel.border = element_blank(),
    axis.ticks = element_blank(),
    axis.text.x = element_blank(),
    axis.text.y = element_blank(),
    legend.position = "bottom"
  )

# Canarias
p.can <-
  ggplot(df.can, aes(x = long, y = lat, group = group)) +
  geom_polygon(aes(fill = random), colour = "white", size = 0.1) +
  labs(x = " ", y = " ") +
  theme_bw() +
  scale_fill_viridis_c('Datos aleatorios', option = "magma", direction = -1) +
  coord_map() +
  theme(
    panel.grid.minor = element_blank(),
    panel.grid.major = element_blank(),
    panel.border = element_blank(),
    axis.ticks = element_blank(),
    axis.text.x = element_blank(),
    axis.text.y = element_blank(),
    legend.position = "bottom"
  )


# Mostramos los gráficos
p.pen
p.can

Mapas

Enlace al pdf.

  • Península y Baleares
  • Canarias
  • Castilla-La Mancha
  • Entradas relacionadas

    Referencias

    2015-07-18

    Generar todas las combinaciones posibles —producto cartesiano— en R

    Title

    Problema

    Queremos obtener el producto cartesiano, todas las combinaciones posibles de varios vectores.

    Solución

    Además de los siguientes ejemplos puedes ver más en entradas relacionadas.

    Dos vectores

    • expand.grid
    • expand.grid(1:5, 1:5)
      
    • merge
    • merge(1:5, 1:5)
      
    • Cross join con sqldf
    • library(sqldf)
      df1 <- data.frame(a = 1:5)
      df2 <- df1
      sqldf("SELECT df1.a, df2.a FROM df1 
            CROSS JOIN df2")
      
    • Resultado
    •    x y
      1  1 1
      2  2 1
      3  3 1
      4  4 1
      5  5 1
      6  1 2
      7  2 2
      8  3 2
      9  4 2
      10 5 2
      11 1 3
      12 2 3
      13 3 3
      14 4 3
      15 5 3
      16 1 4
      17 2 4
      18 3 4
      19 4 4
      20 5 4
      21 1 5
      22 2 5
      23 3 5
      24 4 5
      25 5 5
      
    Más de dos vectores

    • expand.grid.
    • a <- c('europe', 'asia')
      b <- c('co2', 'temperature')
      c <- c('min', 'max')
      expand.grid(a, b, c)
      
          Var1        Var2 Var3
      1 europe         co2  min
      2   asia         co2  min
      3 europe temperature  min
      4   asia temperature  min
      5 europe         co2  max
      6   asia         co2  max
      7 europe temperature  max
      8   asia temperature  max
      

    Entradas relacionadas

    Referencias

    Nube de datos