R POSIXct日期匹配(可能很容易!)
我需要从数据帧创建一个Xts对象,按周分割,然后执行计算。我不知道如何将Xts POSIXct日期与父数据帧的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
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我有利于简化它。