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'

PERDIDAS SILENCIOSAS

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")

AGREGACION PRECISA

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)


VicenteYago/sensorsUtils documentation built on Jan. 29, 2022, 12:44 a.m.