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

2019-05-11

How to create boxplots grouping into intervals x-axis values using R?

Problem

We want to create boxplots grouping into intervals the values of the x-axis, like in the example below.

Solution

Data

We generate random data and a sequence to create the intervals.

set.seed(12)
y <- rnorm(1000)
x <- rnorm(1000)
rng <- seq(-3, 3, 0.5)
  • Base
  • boxplot(y ~ cut(x, breaks = rng),las=2)
    
    If we'd like to include not available data (NAs), we use the function addNA:

    boxplot(y ~ addNA(cut(x, breaks = rng)), las = 2)
    
  • ggplot2
  • First we create data frame with the intervals.

    library(ggplot2)
    df <- data.frame(x = cut(x, breaks = rng), y = y)
    ggplot(data = df, aes(x = x, y = y)) + geom_boxplot(aes(fill = x))
    

    Related posts

    References

    2018-03-06

    Filtrar un data frame basado en intervalos de tiempo en R

    Problema

    Para cada una de las Species queremos quedarnos con la primera imagen (columna ID) de cada intervalo de una hora empezando por la fecha inicial: 2015-03-16 18:42:00. Es decir, para la Specie A, nos queremos quedar con P1, P3 y P4. P2 no la consideraríamos pues está dentro del intervalo de una hora a partir de P1, entre las 18:42 y las 19:41.

      ID Species            DateTime
    1 P1       A 2015-03-16 18:42:00
    2 P2       A 2015-03-16 19:34:00
    3 P3       A 2015-03-16 19:58:00
    4 P4       A 2015-03-16 21:02:00
    5 P5       B 2015-03-16 21:18:00
    6 P6       A 2015-03-16 21:19:00
    7 P7       A 2015-03-16 21:33:00
    8 P8       B 2015-03-16 21:35:00
    9 P9       B 2015-03-16 23:43:00
    
    • Datos
    df <- read.table(
      text = 'ID   Species       DateTime
      P1   A            "2015-03-16 18:42:00"
      P2   A             "2015-03-16 19:34:00"
      P3   A             "2015-03-16 19:58:00"
      P4   A             "2015-03-16 21:02:00"
      P5   B             "2015-03-16 21:18:00"
      P6   A             "2015-03-16 21:19:00"
      P7   A             "2015-03-16 21:33:00"
      P8   B             "2015-03-16 21:35:00"
      P9   B             "2015-03-16 23:43:00"',
      stringsAsFactors = FALSE,
      header = TRUE
    )
    
    

    Solución

    Creamos una nueva columna con los intervalos cada 60 minutos y nos quedamos con la primera ocurrencia para cada una de las Species. Es importante señalar que dentro de la función cut tenemos que especificar 60 minutos y no una hora ("1 hour"), o de lo contrario el intervalo no tendría en cuenta los minutos sino solamente las horas. Es decir, comenzaría el primer intervalo a las 18:00 y no a las 18:42.

    library(dplyr)
    df$DateTime <- as.POSIXct(df$DateTime)
    df %>%
      mutate(by60 = cut(DateTime, "60 min")) %>%
      group_by(Species, by60) %>%
      slice(1) %>%
      ungroup() %>%
      select(-by60)
    

    Resultados

    # A tibble: 5 x 3
      ID    Species DateTime           
                       
    1 P1    A       2015-03-16 18:42:00
    2 P3    A       2015-03-16 19:58:00
    3 P4    A       2015-03-16 21:02:00
    4 P5    B       2015-03-16 21:18:00
    5 P9    B       2015-03-16 23:43:00
    

    Referencias

    2015-09-17

    ¿Cómo crear en R diagramas de caja agrupando los valores de x en intervalos?

    Title

    Problema

    Deseamos crear diagramas de caja agrupando los valores del eje x en intervalos.

    Soluciones

    Datos

    Generamos unos datos aleatorios y una secuencia que emplearemos para crear los intervalos.

    set.seed(12)
    y <- rnorm(1000)
    x <- rnorm(1000)
    rng <- seq(-3, 3, 0.5)
    
  • Paquete base
  • boxplot(y ~ cut(x, breaks = rng),las=2)
    
    Si queremos incluir los valores no disponibles (NAs), utilizamos la función addNA:

    boxplot(y ~ addNA(cut(x, breaks = rng)), las = 2)
    
  • Paquete ggplot2
  • Creamos primero el data frame con los intervalos.

    library(ggplot2)
    df <- data.frame(x = cut(x, breaks = rng), y = y)
    ggplot(data = df, aes(x = x, y = y)) + geom_boxplot(aes(fill = x))
    

    Entradas relacionadas

    Referencias

    Nube de datos