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

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

    2017-10-16

    Eliminar columnas con nombres duplicados de un data frame en R

    Problema

    Queremos eliminar las columnas con nombres duplicados de un data frame en R.

    df <- data.frame(a = 1:2, b = 1:2, 
                     c = 1:2, a = 2:3, 
                     a = 2:3, b = 2:3, 
                     check.names = F)
    
      a b c a a b
    1 1 1 1 2 2 2
    2 2 2 2 3 3 3
    

    Solución

    • Base
    • df[, !duplicated(df)] # o bien
      df[, unique(df)]
      
       a b c
      1 1 1 1
      2 2 2 2
      
    • dplyr
    • Empleamos funciones del paquete base pero evitamos los corchetes para hacerla más legible.

      library(dplyr)
      df %>% subset(select = !duplicated(names(.))) # o bien
      df %>% subset(select = unique(names(.)))
      

    2016-10-15

    Contar elementos únicos de una cadena de texto en R

    Title

    Problema

    Dada una cadena de texto queremos contar el número de veces que aparecen los elmentos 'A', 'C', 'G', y 'T'.

    v <- c("AGCTTTTCATTCTGACTGCAACGGGCAATATGTCTCTGTGTGGATTAAAAAAAGAGTGTCTGATAGCAGC")
    # Si importamos un fichero que contiene la cadena de texto
    v <- readLines("rosalind_dna.txt")
    

    Solución

    • Paquete base
    • table(strsplit(v, NULL)[[1]])
      
      A  C  G  T 
      20 12 17 21 
      
    • Paquete stringr para la manipulación de cadenas de texto
    • library(stringr)
      # 1 - Elementos codificados a mano
      str_count(v, c("A", "C", "G", "T")) 
      # 2 - Extrae alfabéticamente elementos únicos
      str_count(v, sort(unique(strsplit(v, NULL)[[1]]))) 
      
      [1] 20 12 17 21
      

    Referencias

    2015-06-29

    Eliminar duplicados de un data frame en R

    Title

    Problema

    Deseamos eliminar los duplicados de un data frame en R.

    Solución

    Disponemos de múltiples opciones. Emplearemos como ejemplo el conjunto de datos iris que contiene dos filas duplicadas: la 102 y la 143

  • Paquete base
  • Detectamos los duplicados.

    # De arriba a abajo
    anyDuplicated(iris) # Número de fila
    iris[duplicated(iris), ]  # Fila
    
        Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
    143          5.8         2.7          5.1         1.9 virginica
    
    # De abajo a arriba
    anyDuplicated(iris, fromLast = TRUE)
    iris[duplicated(iris, fromLast = TRUE), ]
    
        Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
    102          5.8         2.7          5.1         1.9 virginica
    
    Eliminamos los duplicados.

    unique(iris)
    iris[!duplicated(iris), ]
    # En orden inverso
    unique(iris, fromLast = TRUE)
    iris[!duplicated(iris, fromLast = TRUE), ]
    
  • Paquete dplyr
  • library(dplyr)
    iris %>% distinct
    
  • Paquete sqldf
  • library(sqldf)
    sqldf('SELECT DISTINCT * FROM iris')
    

    Notas

    Usando el paquete base veremos que conserva el número de filas —150— aunque observaremos, dependiendo del orden que hayamos escogido, que la fila 102 o 143 habrá desaparecido. En cambio con dplyr y sqldf, el resultado numera de nuevo las filas, mostrando la última con el número 149.

    Entradas relacionadas

    2015-05-27

    Project Euler - Problema 5 en R

    Title Continuamos con los problemas planteados en Project Euler.

    Problema - Smallest multiple

    2520 is the smallest number that can be divided by each of the numbers from 1 to 10 without any remainder.
    What is the smallest positive number that is evenly divisible by all of the numbers from 1 to 20?

    2520 es el número más pequeño que puede ser dividido por cada uno de los números del 1 al 10 sin ningún resto.
    ¿Cuál es el número positivo más pequeño que es divisible por todos los números del 1 al 20?

    Solución

    require(numbers)
    mLCM(1:20)
    
    [1] 232792560
    

    Notas

    Usamos la función mLCM para calcular el mínimo común múltiplo de los números del 1 al 20.

    Otra alternativa manual sería calcular los factores primos de cada uno de los números. Después inspeccionamos visualmente los factores comunes de todos ellos.

    x <- matrix(1:20)
    apply(x, 1, primeFactors)
    
    [[1]]
    [1] 1
    
    [[2]]
    [1] 2
    
    [[3]]
    [1] 3
    
    [[4]]
    [1] 2 2
    
    [[5]]
    [1] 5
    
    [[6]]
    [1] 2 3
    
    [[7]]
    [1] 7
    
    [[8]]
    [1] 2 2 2
    
    [[9]]
    [1] 3 3
    
    [[10]]
    [1] 2 5
    
    [[11]]
    [1] 11
    
    [[12]]
    [1] 2 2 3
    
    [[13]]
    [1] 13
    
    [[14]]
    [1] 2 7
    
    [[15]]
    [1] 3 5
    
    [[16]]
    [1] 2 2 2 2
    
    [[17]]
    [1] 17
    
    [[18]]
    [1] 2 3 3
    
    [[19]]
    [1] 19
    
    [[20]]
    [1] 2 2 5
    
    Los factores serían: (2^4)*(3^2)*5*7*11*13*17*19 = 232792560

    Para calcular los factores primos únicos

    unique(unlist(apply(x, 1, primeFactors)))
    
    [1]  1  2  3  5  7 11 13 17 19
    

    Referencias

    Nube de datos