knitr::opts_chunk$set( collapse = TRUE, comment = "#>" )
library(sensorsUtils) library(tidyverse)
En esta viñeta, se expican la motivación y funcionamineto de las funciones más importantes del paquete 'sensorsUtils'
Uno de los problemas mas frecuentes al tratar con sensores es la perdida de información. En muchas situaciones los observaciones perdidas no son indicadas de forma explicita en los datasets, es decir no existen NAs, a este fenomeno lo llamo "perdidas silenciosas".
El primer paso para arreglar la información y tratar con ella es forzar la aparicion de las perdidas sileciosas, este el papel de la función fortify_df:
fA <- as.POSIXct("2019/01/01") fB <- as.POSIXct("2019/01/02") #fake dataframe dates = seq(fA, fB, by = "hour") #provocar perdidas silenciosas df <- data.frame(dates = dates[-(sample(1:25,10))], A = 1:15, B = LETTERS[1:15], C = rnorm(15)) df
Hemos creado un dataframe ficticio con observaciones horarias de un fenomeno cualquiera. Y hemos forzado la perdida silenciosa de 5 observaciones, en posiciones aleatorias.
df.fortified<-fortify_df(df, by = "hour") df.fortified
Por defecto la función indica las observaciones perdidas entre la primera y la última fecha, esto puede suponer un problema si las perdidas silenciosas afectan a la ultima observación. Por este motivo se puede espeficificar de forma manual el intervalo para el cual se quieren especificar todas las observaciones perdidias:
df.fortified<-fortify_df(df,c(fA,fB), by = "hour") df.fortified
'fortify_df' tambien funciona para unificar multiples dataframes univariables en uno comun, el problema de esta operacion es que no todos los sub-dataframes tiene porque empezar y finalizar en las mismas fechas, ademas de que cada uno tenga sus propias perdidas silenciosas, todo esto provoca que existan diferentes numeros de filas, y por lo tanto no se pueda realizar una unión directa de estos subdataframes. Por ejemplo:
df.A <- data.frame(dates = dates[-(sample(1:25,5))], A = LETTERS[1:20]) df.B <- data.frame(dates = dates[-(sample(1:25,3))], B = 1:22) df.C <- data.frame(dates = dates[-(sample(1:25,7))], C = rnorm(18)) fortify_df(list(df.A, df.B, df.C), by = "hour")
Una de las operaciones más frecuentes es la agregación de datos en un intervalo dado (horas, días, semanas ...) En el siguiente ejemplo se ha creado un dataframe con un frecuencia horaria, 48 horas en total:
n = 24*2 data.frame(time = seq(fA, by = "1 hour", length.out = n), A = cumsum(sample(c(-1, 1), n, TRUE)), B = cumsum(sample(c(-1, 1), n, TRUE)) ) -> df df
Con la función 'make.aggregation', podemos agregar los datos de forma diaria, introduciendo freq = 24, la agregación se realiza con la función proporcionada por el usuario:
make.aggregation(df, freq = 24, fun = mean) -> df.daily.mean df.daily.mean make.aggregation(df, freq = 24, fun = max) -> df.daily.max df.daily.max
Para agregar en otro intervalo, simplemente hay que ajustar 'freq':
# 2 Horas make.aggregation(df, freq = 2, fun = mean)
# 2 Dias make.aggregation(df, freq = 48, fun = mean)
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.