2017-09-25

Mínimo común múltiplo y máximo común divisor en R

Title

Problema

Deseamos calcular el mínimo común múltiplo y el máximo común divisor de un vector en R.

Solución

Usamos el paquete numbers. Las funciones mLCM(x) y mGCD(x) computan el mínimo común múltiplo y el máximo común divisor de todos los número de un vector x de números enteros:

library(numbers)
    mGCD(c(4, 8, 12, 16, 20))
[1] 4
    mLCM(c(8,9,21))
[1] 504
    # Sequences
    mLCM(1:20)
[1] 232792560

Referencias

2017-08-31

Eliminar los niveles no usados de un factor en R

Title

Problema

Cuando filtramos un data frame que contiene un factor, y creamos por ejemplo una tabla de contingencia, R nos muestra también aquellos niveles del factor no usados.

df <- data.frame(name = c("a", "a", "a", "b", "b", "c", "c", "c", "c"), x = 1:9)
library(dplyr)
aa <-  df %>%
  group_by(name) %>%
  filter(n() < 4) %>% 
  droplevels()
table(aa$name)
En este ejemplo muestra c, cuando queremos que muestre solamente a y b.

# Resultado
a b c 
3 2 0
# Resultado deseado
a b 
3 2

Solución

Usamos la función droplevels o factor.

table(droplevels(aa$name))
table(factor(aa$name))
O como estamos empleando el paquete dplyr.

aa <-  df %>%
  group_by(name) %>%
  filter(n() < 4) %>% 
  droplevels()
table(aa$name)

Referencias

2017-08-16

Cómo comparar varias distribuciones de frecuencias con ggplot2

Title

Problema

Como vimos anteriormente con ggplot2 podemos crear un histograma fácilmente.

library(ggplot2)
ggplot(diamonds, aes(price)) +
  geom_histogram(binwidth = 500)
Pero si queremos comparar por calidad de tallado (quality of the cut), podríamos:
  • Filtrar por tipo de tallado

  • library(dplyr)
    ggplot(filter(diamonds, cut == "Ideal"), aes(price)) +
      geom_histogram(binwidth = 500)
    

  • Apilar por tipo de tallado

  • ggplot(diamonds, aes(price, fill = cut)) +
      geom_histogram(binwidth = 500)
    
  • Sin apilar aplicando transparencia
  • 
    ggplot(diamonds, aes(price, fill = cut)) +
    +     geom_histogram(binwidth = 500, position = "identity", alpha = 0.2)
    

Solución

Una alternativa más clara es utilizar la función geom_freqpoly que muestra líneas en lugar de barras para representar las frecuencias. Cuando se solapan es más sencillo interpretar líneas que barras.

ggplot(diamonds, aes(price, colour = cut)) +
  geom_freqpoly(binwidth = 500)
Si deseamos representar solamente un tipo de tallado:

ggplot(filter(diamonds, cut == "Ideal"), aes(price, colour = cut)) + geom_freqpoly(binwidth = 500)

Referencias

2017-08-14

Reemplazar múltiples palabras simultáneamente con Notepad++

Title

Problema

Queremos reemplazar múltiples palabras simultáneamente con Notepad++ dentro de la función buscar y reemplazar. En este ejemplo deseamos reemplazar las siguientes 4 cadenas de texto a la izquierda de la flecha por las de la derecha.

Beaker -> Felix
Pants -> Ace
Quijote -> Quesada
3 -> 5551
Beaker
Quijote
Pants
Smarty
Beaker
Pants
Quijote
Smarty
3

Solución

En Find what: introducimos cada cadena de texto entre paréntesis y separada por |:

(Beaker)|(Smarty)|(Quijote)
En Replace with introducimos cada cadena de texto entre paréntesis, precedida de ? y del número del orden de la sustitución(entre corchetes en el caso de que reemplacemos un número):

(?1Felix)(?2Ace)(?3Quesada)(?{4}5551)
Nos aseguramos de que está marcada la opción Regular expression. Situamos el cursor al inicio del documento y presionamos Replace All.

Resultado

Felix
Quesada
Pants
Ace
Felix
Pants
Quesada
Ace
5551

Entradas relacionadas

2017-08-03

Añadir un cuadro de texto a un gráfico en R

Title

Problema

Queremos añadir un cuadro de texto a un gráfico en R. A continuación, podemos ver una primera solución, pero el código es demasiado verboso y alambicado.

# Un gráfico
plot(x = runif(1000), y = runif(1000), type = "p", pch = 16, col = "#40404050")

## Parámetros para el texto
myText <- "some Text"
posCoordsVec <- c(0.5, 0.5)
cex <- 2

# Rectángulo
textHeight <- graphics::strheight(myText, cex = cex)
textWidth <- graphics::strwidth(myText, cex = cex)
pad <- textHeight*0.3
rect(xleft = posCoordsVec[1] - textWidth/2 - pad, 
        ybottom = posCoordsVec[2] - textHeight/2 - pad, 
        xright = posCoordsVec[1] + textWidth/2 + pad, 
        ytop = posCoordsVec[2] + textHeight/2 + pad,
        col = "lightblue", border = NA)

# Ubicación del texto
text(posCoordsVec[1], posCoordsVec[2], myText, cex = cex)

Solución

  • Base graphics
  • Empleamos la función legend, con el mismo color en los bordes y relleno que en la solución inicial, y ajustamos el texto en el interior con el argumento adj.

    plot(x = runif(1000), y = runif(1000), type = "p", pch = 16, col = "#40404050")
    legend(0.4, 0.5, "Some text", box.col = "lightblue", bg = "lightblue", adj = 0.2)
    
  • ggpplot2
  • Con ggplot2 usamos la función geom_label. A diferencia de legend en base graphcis, el texto se centra automáticamente dentro del cuadro, con label.size = NA eliminamos los bordes

    library(ggplot2)
    df <- data.frame(x = runif(1000), y = runif(1000))
    ggplot(data = df, aes(x = x , y = y))+ 
      geom_point(alpha = 0.2)+
      geom_label(aes(x = 0.5, y = 0.5, label = "Some text"), 
                 fill = "lightblue", label.size = NA, size = 5)
    

Referencias

2017-07-31

Listar ficheros de un directorio con una determinada extensión en R



Title

Problema

Queremos extraer los nombres de los ficheros con una determinada extensión dentro de un directorio.

Solución

# Especificamos el directorio, si fuera distinto del actual
setwd("C:/Users/nubededatos/Carpeta")
# Listamos los ficheros 
ficheros <- list.files(pattern = "\\.csv")

Resultado

[1] "0008a68c5e0f9446845c4ad77ab6fc6cc2f623a1f7a39e112d51b9d49177059a.csv"
[2] "000e287cf122b1203172b328fb97ebf1976485611a11dcaeb21b0214a90ef314.csv"
[3] "001a3d3bc0679a88f599b167feb8e1a84a26c14c73bac1ced319b5857227a161.csv"
[4] "001d6b50df57ffd739d7d32ccf26e00d3792729071298743092f3257e8b7cfb1.csv"
[5] "0020626e0631fabff9e0e7983285f021e3068d0de6bede9b25005c5da97bcc58.csv"
[6] "00208a90926c7b54c13abacaba725709a090d907cf3e0f8e5f771fcdda3d526f.csv"

Si necesitamos eliminar la extensión, por ejemplo, para comparar posteriormente los nombres con un vector:

ficheros <- strtrim(files, nchar(files)-4) 

Entradas relacionadas

Referencias

2017-07-29

Anotar diagrama de caja en ggplot2

Title

Problema

Deseamos anotar el siguiente diagrama de caja en ggplot2 y añadir los 5 números de Tukey: mínimo, bigote inferior, mediana, bigote superior, máximo.

fivenum(iris$Sepal.Width)
[1] 2.0 2.8 3.0 3.3 4.4
library(ggplot2)
ggplot(iris, aes(factor(0), Sepal.Width)) + 
geom_boxplot() + xlab("") + scale_x_discrete(breaks = NULL)

Solución

Creamos el data frame five con los 5 números de Tukey que utilizamos en los argumentos de geom_text para anotar el gráfico.

five <- data.frame(x = rep(1, 5), five = fivenum(iris$Sepal.Width))
ggplot(iris, aes(x = 0, y = Sepal.Width)) + 
  geom_boxplot() + xlab("") + scale_x_discrete(breaks = NULL) + 
  geom_text(data = five, aes(x = 0, y = five, label = five), nudge_x = 0.5)

Referencias

Entradas relacionadas

Nube de datos