R POSIXct日期匹配(可能很容易!)

R POSIXct日期匹配(可能很容易!),r,match,posixct,R,Match,Posixct,我需要从数据帧创建一个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

我需要从数据帧创建一个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)

value这里是一个
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
库(data.table)

DT这里是一个
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
库(data.table)

DT我认为使用
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

我认为使用
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

非常感谢迪科阿。两种解决方案都能很好地工作,但您的解决方案看起来更清晰一些。问题-当值是一个向量,但DF$value对整个列求和时,值之和起作用:向量起作用:
ddply(DF,((week=week(DF$DTime),DF$staff),summary,sum=sum(value))
DF$vector不起作用:
ddply(DF,((week=week(DF$DTime),DF$staff),sum),sum=sum)(DF$value))
非常感谢dickoa。这两种解决方案都很好,但您的解决方案看起来更清晰。问题-当值是向量,而DF$value对整个列求和时,值之和起作用:向量起作用:
ddply(DF,(
dweek(DF$DTime),DF$staff),summary,sum=sum(value))
DF$vector不起作用:
ddply(DF,(
dweek=week)(DF$DTime),DF$staff),总结,总结=总结(DF$value))
注意:上面的解决方案解决的是工作日而不是星期,例如第7行..第6周是5周-月。@felixmc很好的回答。我编辑我的答案a我有利于简化它。注意:上面的解决方案解决的是工作日而不是星期,例如第7行..第6周是5周-月。@felixmc很好的回答。我编辑我的答案a我有利于简化它。