2018-01-25

Media móvil en R

Problema

¿Cómo podemos calcular la media móvil en R? Es decir, calcular la media aritmética de n datos anteriores. En el siguiente ejemplo, la media de los 4 datos anteriores. En el primer cálculo la media de los 4 primeros términos: del 1 al 4. En el segundo del 2 al 5, y así sucesivamente.

   num media_movil
1       1          NA
2       2          NA
3       3          NA
4       4         2.5
5       5         3.5
6       6         4.5

Solución

Muestro dos alternativas, con los paquetes zoo y RcppRoll, con sintáxis casi idéntica. En ambas utilizo dplyr para crear la nueva columna con la función mutate.

  • Alternativa 1: zoo
  • Con el argumento k (4 en este ejemplo) suministramos un número entero que indica el intervalo de la media móvil.

    library(zoo) 
    library(dplyr)
    df <- data.frame(num = 1:20)
      df %>% mutate(media_movil = rollmean(num, k = 4 , fill = NA, align = "right"))
    
  • Alternativa 2: RcppRoll
  • Con el argumento n (4 en este ejemplo) suministramos un número entero que indica el intervalo de la media móvil.

    library(RcppRoll)
    df %>% mutate(media_movil = roll_mean(num, n = 4, fill = NA, align = "right"))
    

Resultados

   num media_movil
1    1          NA
2    2          NA
3    3          NA
4    4         2.5
5    5         3.5
6    6         4.5
7    7         5.5
8    8         6.5
9    9         7.5
10  10         8.5
11  11         9.5
12  12        10.5
13  13        11.5
14  14        12.5
15  15        13.5
16  16        14.5
17  17        15.5
18  18        16.5
19  19        17.5
20  20        18.5

Referencias

2018-01-20

Rellenar área con teselas en ggplot2

Problema

Con ggplot2 queremos rellenar una región cuadrada con teselas cuadradas. El intento original del usuario que plantéo la pregunta fue:

  • Datos
set.seed(1)
library(ggplot2)
# Datos
l = 1000
a = seq(0, 1, 1 / (l - 1))
x = rep(a, each = length(a))
y = rep(a, length(a))
k = length(x)
c = sample(1:10, k, replace = TRUE)
data <- data.frame(x, y, c)
# Gráfico
ggplot(data, aes(x = x, y = y)) + geom_point(shape = 15, color = c)

Solución

  • Alternativa 1
  • Reducimos el tamaño del data frame, l = 10 en el código anterior para poder apreciar los cuadrados. Y usamos el argumento "white" como colour p para resaltar las teselas con un contorno blanco.

    ggplot(data, aes(x = x, y = y, fill = c)) + geom_tile(colour = "white")
    
  • Alternativa 2
  • Creamos manualmente una paleta, y empleamos coord_equal para generar cuadrados, forzando a que una unidad en el eje x tenga la misma longitud que una unidad en el eje y.

    colors<-c("peachpuff", "yellow", "orange", "orangered", "red", 
              "darkred","firebrick", "royalblue", "darkslategrey", "black")
    ggplot(data, aes(x = x, y = y)) +
      geom_tile(aes(fill = factor(c)), colour = "white") +
      scale_fill_manual(values = colors, name = "Colours") +
      coord_equal()
    

Notas

Para apreciar lo que sucede cuando creamos el gráfico original con geom_point, reducimos el tamaño del data frame, a 10 x 10. Lo representamos seguido de las dos alternativas propuestas.

  • Nuevo data frame
  • l = 100
    a = seq(0, 1, 1 / (l - 1))
    x = rep(a, each = length(a))
    y = rep(a, length(a))
    k = length(x)
    c = sample(1:10, k, replace = TRUE)
    data <- data.frame(x, y, c)
    
  • Gráfico original
  • ggplot(data, aes(x = x, y = y)) + geom_point(shape = 15, color = c)
    
  • Alternativa 1
  • ggplot(data, aes(x = x, y = y, fill = c)) + geom_tile(colour = "white")
    
  • Alternativa 2
  • colors<-c("peachpuff", "yellow", "orange", "orangered", "red", 
              "darkred","firebrick", "royalblue", "darkslategrey", "black")
    ggplot(data, aes(x = x, y = y)) +
      geom_tile(aes(fill = factor(c)), colour = "white") +
      scale_fill_manual(values = colors, name = "Colours") +
      coord_equal()
    

Referencias

2018-01-16

Abrir simultáneamente múltiples hipervículos en Excel

Problema

Queremos abrir simultáneamente múltiples hipervículos en Excel.

Solución

  1. Abrimos el Editor de Microsoft Visual Basic: Alt+F11.
  2. Creamos la siguiente función en un módulo.
    • Sub Abrir_Hipervinculos()
          On Error Resume Next
          Dim hl As Hyperlink
          For Each hl In Selection.Hyperlinks
              hl.Follow
          Next hl
      End Sub
      
  3. Seleccionamos el rango de celdas que contiene los enlaces y presionamos Alt+F8.
  4. Tecleamos Alt+F8 y presionamos Ejecutar.
  5. Los enlaces se abrirán en el navegador predeterminado. Si alguna celda está vacía, contiene texto no reconocido como hipervínculo, o un hipervínculo no válido, los enlaces no se abrirán y no generará error pues hemos especificado On Error Resume Next.

Entradas relacionadas

Referencias

2018-01-14

Gráfico y tabla subyacente en una misma página en R

Problema

Queremos mostrar un gráfico junto con su tabla subyacente en una misma página en R.

  • Datos y gráfico original
df <- data.frame(
  group = c("A", "A", "A", "B", "B", "B"),
  x = c(1, 2, 3, 1, 2, 3),
  y = c(2, 5, 7, 7, 5, 3)
)
library(ggplot2)
p <- ggplot(data = df, aes(
  x = x,
  y = y,
  group = group,
  color = group
)) +
  geom_line() +
  geom_point()

Solución

Empleamos el paquete gridExtra, con tableGrob creamos la tabla y con grid.arrange ordenamos los dos elementos, la tabla y el gráfico, en una misma página.

library(gridExtra)
tbl <- tableGrob(t(df), rows = NULL , theme = ttheme_minimal())
grid.arrange(p,
             tbl,
             nrow = 2,
             as.table = TRUE,
             heights = c(3, 1))

Referencias

2018-01-12

Filtrar entre dos fechas con dplyr

Problema

Queremos filtra entre dos fechas utilizando el paquete dplyr.

    Patch       Date Prod_DL
1    BVG1   9/4/2015    3.43
2   BVG11  9/11/2015    3.49
3   BVG12  9/18/2015    3.45
4   BVG13  12/6/2015    3.57
5   BVG14 12/13/2015    3.43
6   BVG15 12/20/2015    3.47
  • Datos
df <- read.table(
  text = "Patch,Date,Prod_DL
  BVG1,9/4/2015,3.43
  BVG11,9/11/2015,3.49
  BVG12,9/18/2015,3.45
  BVG13,12/6/2015,3.57
  BVG14,12/13/2015,3.43
  BVG15,12/20/2015,3.47",
  sep = ",",
  stringsAsFactors = FALSE,
  header = TRUE,
  row.names = NULL
)

Solución

  • Alternativa 1
  • Formateamos la fecha correctamente y filtramos entre las dos fechas deseadas.

    library("dplyr")
    df$Date <-as.Date(df$Date,"%m/%d/%Y")
    df %>%
      select(Patch, Date, Prod_DL) %>%
      filter(Date > "2015-09-04" & Date < "2015-09-18")
    
        Patch       Date Prod_DL
    1   BVG11 2015-09-11    3.49
    
  • Alternativa 2
  • Formateamos la fecha correctamente y empleamos la función between: 'This is a shortcut for x >= left & x <= right, implemented efficiently in C++ for local values, and translated to the appropriate SQL for remote tables.'. Por tanto es necesario ajustar las fechas pues incluye ambas fechas en los dos lados. Necesitamos usar as.Date, explicación aquí.

    df$Date <- as.Date(df$Date, "%m/%d/%Y")
    df %>% 
      select(Patch, Date, Prod_DL) %>%
      filter(between(Date, as.Date("2015-09-05"), as.Date("2015-09-17")))
    
        Patch       Date Prod_DL
    1   BVG11 2015-09-11    3.49
    

    Referencias

    2017-12-31

    Las entradas más visitadas en 2017

    Las 10 entradas más visitadas en 2017 en las categorías de R, Excel, Access y VBA han sido:

    R

    1. Eliminar duplicados de un data frame en R
    2. Test de normalidad Shapiro–Wilk en R
    3. Calcular la moda en R usando el paquete modeest
    4. Superponer gráficos en R: distribución normal
    5. Distribución de frecuencias en R
    6. Medir el tiempo de ejecución de procesos en R
    7. Introducción al paquete igraph para R
    8. Calcular el porcentaje del total de la columna en R
    9. Cómo comparar dos data frames en R
    10. Una introducción a la minería de textos en R con El Quijote

    Excel

    1. Convertir horas en un número decimal en Excel
    2. Invertir lista en Excel
    3. Generar números aleatorios entre dos valores con decimales
    4. Omitir todos los errores de una hoja
    5. Cómo usar BUSCARV y SUMAR conjuntamente en Excel
    6. Concatenar comillas en Excel
    7. Números aleatorios de una lista o rango de opciones
    8. Pegar una lista filtrada con Excel en las celdas visibles
    9. Formato condicional que diferencia ceros y celdas vacías
    10. Calcular la duración del día y el horario de verano en Excel

    Access

    1. Cuadros combinados en cascada en Ms Access
    2. Ocultar Access al usuario salvo el formulario
    3. Cambiar programáticamente la ruta de tablas vinculadas en Access
    4. Usar un cuadro combinado para buscar al teclear en Access
    5. Crear una consulta de UNION y de UNION ALL en Ms Access
    6. Convertir texto en número conservando los decimales en Access
    7. Porcentaje del total de la columna en una consulta de Access
    8. Generar números aleatorios entre dos valores en Ms Access
    9. Consulta para generar una muestra aleatoria en Ms Access
    10. La función redondear en Access, redondeo del banquero

    VBA

    1. Importar ficheros CSV en Excel mediante VBA
    2. Sucesión de Fibonacci en Excel y VBA
    3. Cambiar origen de datos de múltiples tablas dinámicas con VBA
    4. Medir el tiempo de ejecución de subrutinas en VBA
    5. Ocultar o mostrar todas las hojas de un libro de Excel (VBA)
    6. Exportar tabla o consulta de Access como CSV
    7. Insertar un reloj en Excel usando VBA
    8. VBA: cambiar el texto a mayúsculas, minúsculas o nombre propio
    9. Mostrar u ocultar formas en Excel mediante VBA
    10. Obtener el nombre de usuario de Windows con VBA en Excel

    Entradas relacionadas

    Importar datos desde una URL en R

    Problema

    ¿Cómo podemos importar datos desde una URL en R? Tenemos una URL en la que hay un fichero de texto y queremos importarlo en R sin necesidad de descargarlo antes de importarlo.

    Si accedemos a esta dirección, nos aparecerá una ventana emergente indicándonos si queremosa abrirlo o guardarlo.

    http://www-bcf.usc.edu/~gareth/ISL/Advertising.csv
    

    Solución

    Simplemente indicamos a la función correspondiente, la ruta URL. Además del paquete base, muestro dos ejemplos con dos paquetes muy populares: data.table y readr.

    • Base
    • ad <- read.csv("http://www-bcf.usc.edu/~gareth/ISL/Advertising.csv")
      head(ad)
      
        X    TV radio newspaper sales
      1 1 230.1  37.8      69.2  22.1
      2 2  44.5  39.3      45.1  10.4
      3 3  17.2  45.9      69.3   9.3
      4 4 151.5  41.3      58.5  18.5
      5 5 180.8  10.8      58.4  12.9
      6 6   8.7  48.9      75.0   7.2
      
    • data.table
    • library(data.table)
      ad <- fread("http://www-bcf.usc.edu/~gareth/ISL/Advertising.csv")
      head(ad)
      
      V1    TV radio newspaper sales
      1:  1 230.1  37.8      69.2  22.1
      2:  2  44.5  39.3      45.1  10.4
      3:  3  17.2  45.9      69.3   9.3
      4:  4 151.5  41.3      58.5  18.5
      5:  5 180.8  10.8      58.4  12.9
      6:  6   8.7  48.9      75.0   7.2
      
    • readr
    • library(readr)
      ad <- read_csv("http://www-bcf.usc.edu/~gareth/ISL/Advertising.csv")
      head(ad)
      
      # A tibble: 6 x 5
           X1    TV radio newspaper sales
                
      1     1 230.1  37.8      69.2  22.1
      2     2  44.5  39.3      45.1  10.4
      3     3  17.2  45.9      69.3   9.3
      4     4 151.5  41.3      58.5  18.5
      5     5 180.8  10.8      58.4  12.9
      6     6   8.7  48.9      75.0   7.2
      

    Referencias

    Nube de datos