2 votes

Correspondance des dates POSIXct (probablement facile !)

Je dois créer un objet Xts à partir d'un cadre de données, le diviser par semaines, puis effectuer des calculs. Je ne sais pas comment faire correspondre les dates POSIXct de Xts avec les dates POSIXct du dataframe parent afin d'obtenir des calculs hebdomadaires.

Exemple :

value <- rep(1, 10)
staff <- as.factor(c("Sam", "Sue", "Sam", "Mary", "Bob", "Sue", "Sam", "Sam", "Sue", "Mary"))
DTime <- as.POSIXct(c("2013-04-01 08:27:00", "2013-04-05 08:28:00", "2013-04-08 08:31:00", 
                    "2013-04-11 08:32:00", "2013-04-15 08:33:00", "2013-04-15 08:40:00",
                    "2013-04-24 08:41:00", "2013-04-27 08:46:00", "2013-04-30 08:46:00",
                    "2013-04-30 08:46:00"))
DF <- data.frame(DTime, staff, value)
tapply(DF$value, DF$staff, sum)

Cela donne les calculs mensuels mais ensuite le fractionnement :

XtsDF <- xts(order.by=DF$DTime, dateFormat="POSIXct")
weeks <- split(XtsDF,f="weeks")

Comment puis-je prendre la date/heure de chaque semaine et la faire correspondre à DF afin d'effectuer la somme, par personnel ?

3voto

dickoa Points 7851

Je pense qu'il sera plus facile à utiliser lubridate qui simplifie beaucoup les opérations sur la date POSIXt et si vous le couplez à plyr c'est encore plus facile.

Voici donc mon approche de ce problème

require(lubridate)
require(plyr)

ddply(DF, .(month = month(DTime), staff), summarise, Sum = sum(value))
##   month staff Sum
## 1     4   Bob   1
## 2     4  Mary   2
## 3     4   Sam   4
## 4     4   Sue   3

ddply(DF, .(week = week(DTime), staff), summarise, Sum = sum(value))
##   week staff Sum
## 1   14   Sam   1
## 2   14   Sue   1
## 3   15  Mary   1
## 4   15   Sam   1
## 5   16   Bob   1
## 6   16   Sue   1
## 7   17   Sam   2
## 8   18  Mary   1
## 9   18   Sue   1

1voto

agstudy Points 55104

Ici, un data.table solution, je créerais d'abord une nouvelle variable pour les semaines

library(data.table)
DT <- as.data.table(DF)
origin <- as.POSIXct("2012-12-9")  ## A Sunday
DT[, c('weekID','sum') := c(weekID,sum(value)),
      by=list(staff,weekID = as.numeric(DTime - origin) %/% 7)]

                DTime staff value weekID sum
 1: 2013-04-01 08:27:00   Sam     1     16  16
 2: 2013-04-05 08:28:00   Sue     1     16  16
 3: 2013-04-08 08:31:00   Sam     1     17  17
 4: 2013-04-11 08:32:00  Mary     1     17  17
 5: 2013-04-15 08:33:00   Bob     1     18  18
 6: 2013-04-15 08:40:00   Sue     1     18  18
 7: 2013-04-24 08:41:00   Sam     1     19  19
 8: 2013-04-27 08:46:00   Sam     1      2   2
 9: 2013-04-30 08:46:00   Sue     1     20  20
10: 2013-04-30 08:46:00  Mary     1     20  20

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X