2

我需要从数据框中创建一个 Xts 对象,按周拆分,然后执行计算。我不知道如何将 Xts POSIXct 日期与父数据框的 POSIXct 日期匹配以获得每周计算。

例子:

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)

这给出了每月计算,然后拆分:

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

我如何获取每周的日期/时间并与 DF 匹配,以便由工作人员执行总和?

4

2 回答 2

3

我认为它会更容易使用lubridate,它可以简化 POSIXt 日期上的很多操作,如果你将它与plyr它结合起来会更容易。

所以这是我解决这个问题的方法

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
于 2013-06-27T12:04:17.437 回答
1

这是一个data.table解决方案,我将首先创建一个新变量数周

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
于 2013-06-27T12:02:02.733 回答