2017-10-17 18 views
0

J'essaie de transformer une colonne particulière d'un jeu de données avec des échantillons quotidiens de données pour différents périphériques dans une colonne de séries temporelles regroupées par deux clés (heure et facteur1)Définir début et fin dans la fonction ts dans data.table groupby

Les données que j'ai est quelque chose comme ça

  date hour factor1 volume wkday 
1: 2015-10-01  AM 11011 530 Thursday  
2: 2015-10-01  AM 11012 1535 Thursday  
3: 2015-10-01  AM 11021 191 Thursday  
4: 2015-10-01  AM 11131 1108 Thursday  
5: 2015-10-01  AM 11132 1518 Thursday  
6: 2015-10-01  AM 11141 508 Thursday  

la date se déroulera du 01/10/2015 à 01/08/2017, heure a deux niveaux (AM et PM), factor1 a plusieurs niveaux et est Joursem pas nécessaire jusqu'à présent. La colonne que je veux transformer en données de timeseries est le volume.

J'ai essayé ce faire:

table_11011 = table[factor1 == '11011'] 
table_11011_am = table_11011[hour == 'AM'] 

table_11011_am[, vol_ts := ts(table_11011_am[,volume], 
        start = decimal_date(table_11011_am[, date][1]), 
        frequency = 365)] 

Ainsi j'obtenir la sortie désirée, mais lorsque je tente de résumer cela pour tous les différents niveaux de FACTOR1 et des heures, je ne sais pas comment saisir le début correct et à la fin rendez-vous amoureux. Jusqu'à présent, j'ai réussi à le faire, mais il semble donner un mauvais rendement.

table[, vol_ts := ts(volume, 
        start = decimal_date(table[, date][1]), frequency = 365), by = c('factor1', 'hour')] 

Toute aide serait appréciée!

Répondre

1

Je ne sais pas si je suis 100% conforme à l'utilisation prévue ici, mais voici comment je pourrais aborder un problème similaire.

Fondamentalement, vous pouvez utiliser seq.Date() pour générer une série régulière de dates, puis utilisez la fonction CJ() (jointure croisée) de data.table pour répéter cette série pour chaque combinaison de vos heures et facteurs.

Une fois que vous avez une série régulière, vous pouvez joindre vos données brutes pour obtenir les données régulièrement espacées que vous cherchez. Je n'ai jamais vraiment traité d'objets de type série temporelle spécialisés dans R, j'ai toujours été capable d'accomplir tout ce dont j'avais besoin avec les paquets data.table, zoo, et RcppRoll.

Espérons que cela puisse vous aider.

library(data.table) 

DT <- data.table(Date = as.Date(c("2015-10-01","2015-10-25","2015-11-04","2015-11-06")), 
       hour = c("AM","PM","AM","PM"), 
       factor1 = c("A","B","C","D"), 
       volume = c(1,2,3,4)) 

## Create a regular sequence of all dates in range 
## with a row for each combo of hour and factor1 
TS <- CJ(Date = seq.Date(from = DT[,min(Date)], to = DT[,max(Date)],by = "day"), 
     hour = DT[,unique(hour)], 
     factor1 = DT[,unique(factor1)]) 

## Join the data to this expanded time series 

setkey(DT,Date,hour,factor1) 
setkey(TS,Date,hour,factor1) 

TS <- DT[TS] 

## Fill with zeros if necessary 
TS[is.na(volume), volume := 0] 

## If you want a separate column for factor level 
Wide <- dcast(TS, ... ~ factor1, value.var = "volume") 

## Or if you want a column (time series) for each combo 
VeryWide <- dcast(TS, ... ~ factor1 + hour, value.var = "volume") 
+0

Ce n'est pas exactement la réponse que je recherchais mais c'était très utile. Ce que je cherche, c'est de définir dans une même colonne les ts d'une nouvelle colonne, mais chaque ts est différent, car chaque facteur1 et heure peut avoir une longueur différente ... Je ne sais pas si Je m'explique. En tout cas, merci beaucoup pour votre aide. –