我需要从数据框创建一个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匹配,以便由员工执行总和?
答案 0 :(得分: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
答案 1 :(得分: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