2016-10-04 1 views
1

J'ai un R dataframe, df, comme ceci:R données agrégées de la série 10 minutes

WIFIAPTag   passengerCount  timeStamp   MAC 
1 E1-1A-1<E1-1-01>  15  2016-09-10 18:55:04 5869.6c54.d040 
750 E1-1A-1<E1-1-01>  14  2016-09-10 18:56:01 5869.6c54.d040 
1499 E1-1A-1<E1-1-01>  18  2016-09-10 18:57:01 5869.6c54.d040 
2248 E1-1A-1<E1-1-01>  17  2016-09-10 18:58:02 5869.6c54.d040 
2997 E1-1A-1<E1-1-01>  17  2016-09-10 18:59:01 5869.6c54.d040 
3746 E1-1A-1<E1-1-01>  14  2016-09-10 19:00:01 5869.6c54.d040 
3746 E1-1A-1<E1-1-01>  1  2016-09-10 19:05:01 5869.6c54.d040 

Maintenant, je veux agréger cette trame de données toutes les 10 minutes, comme ceci:

WIFIAPTag   passengerCount  timeStamp   MAC 
1 E1-1A-1<E1-1-01>  81  2016-09-10 18:50:00 5869.6c54.d040 
2 E1-1A-1<E1-1-01>  15  2016-09-10 19:00:00 5869.6c54.d040 

I en utilisant aggregate et cut dans R comme ceci:

output <- aggregate(passengerCount ~ cut(timeStamp, breaks = "10 mins"), df, sum) 

Mais je ne peux obtenir les données commencent à partir 2016-09-10 18:55:00:

output 
    WIFIAPTag   timeStamp passengerCount 
1 E1-1A-1<E1-1-01> 2016-09-10 18:55:00    95 
2 E1-1A-1<E1-1-01> 2016-09-10 19:05:00    1 

Comment puis-je faire le début de sortie de 2016-09-10 18:50:00?

+1

si vous donnez des pauses une valeur comme ' « 10 minutes »' il partitionnera l'intervalle en cela, en utilisant la première et la dernière date. Au lieu de cela, choisissez vos sauts explicitement: 'seq.POSIXt (as.POSIXct ('2016-09-10 18:50:00'), as.POSIXct ('2016-09-10 23:50:00'), par = 600) 'par exemple – Shape

+0

Ça a marché! Que diriez-vous de répondre ci-dessous pour que je puisse l'accepter? – jjdblast

Répondre

2

L'attribution d'une valeur pour des ruptures telles que "10 min" divise l'intervalle en utilisant la première et la dernière date avec des segments de 10 min.

Au lieu de cela, choisissez vos pauses explicitement:

(En utilisant lubridate, puisque je préfère ne pas coder en dur les valeurs minimales et maximales)

library(lubridate) 

lowtime <- min(df$timeStamp) 
hightime <- max(df$timeStamp) 

# Set the minute and second to the nearest 10 minute value 
minute(lowtime) <- floor(minute(lowtime)/10) * 10 
minute(hightime) <- ceiling(minute(hightime)/10) * 10 
second(lowtime) <- 0 
second(hightime) <- 0 

# Set the breakpoints at 10 minute intervals 
breakpoints <- seq.POSIXt(lowtime, hightime, by = 600) 
output <- aggregate(passengerCount ~ cut(timeStamp, breaks = breakpoints), df, sum)