R 如何计算每组日期时间之间的时间差(学生合同)?
我有一个具体的问题;我有以下格式的数据:R 如何计算每组日期时间之间的时间差(学生合同)?,r,datetime,diff,plyr,date-arithmetic,R,Datetime,Diff,Plyr,Date Arithmetic,我有一个具体的问题;我有以下格式的数据: # USER_ID SUBMISSION_DATE CONTRACT_REF 1 1 20/6 1:00 W001 2 1 20/6 2:00 W002 3 1 20/6 3:30 W003 4 4 20/6 4:00 W004 5 5 20/6 5:00
# USER_ID SUBMISSION_DATE CONTRACT_REF
1 1 20/6 1:00 W001
2 1 20/6 2:00 W002
3 1 20/6 3:30 W003
4 4 20/6 4:00 W004
5 5 20/6 5:00 W005
6 5 20/6 6:00 W006
7 7 20/6 7:00 W007
8 7 20/6 8:00 W008
9 7 20/6 9:00 W009
10 7 20/6 10:00 W0010
现在我需要以某种方式计算不同提交之间的时间差(唯一可识别)
换言之:
我有一个提交表,在这个表中,有所有用户的所有提交。我需要找到一种方法来计算第n个作业和第(n-1)个作业之间每个唯一的学生合同元组的时间差
还要注意的是,每个新用户在新分配中必须为零。因此,输出将如下所示:
# USER_ID SUBMISSION_DATE CONTRACT_REF TIME_DIFFRENCE
1 1 20/6 1:00 W001 0
2 1 20/6 2:00 W002 3600
3 1 20/6 3:30 W003 5400
4 4 20/6 4:00 W004 3600
5 5 20/6 5:00 W005 0
6 5 20/6 6:00 W006 3600
7 7 20/6 7:00 W007 0
8 7 20/6 8:00 W008 3600
9 7 20/6 9:00 W009 3600
10 7 20/6 10:00 W0010 3600
请注意,时间可能不是以秒为单位,而是以适合的时间为单位
我的想法:
1) 我想这需要as.POSIXct在某个地方,以便R知道如何处理时间
2) 这可能涉及一些软件包,如plyr
,但我完全沉浸在文档中,很难找到示例
非常感谢您的回复
最好的,
Jakub这里有一个尝试。首先,获取数据:
dat <- read.csv(text="USER_ID,SUBMISSION_DATE,CONTRACT_REF
1,20/6 1:00,W001
1,20/6 2:00,W002
1,20/6 3:30,W003
4,20/6 4:00,W004
5,20/6 5:00,W005
5,20/6 6:00,W006
7,20/6 7:00,W007
7,20/6 8:00,W008
7,20/6 9:00,W009
7,20/6 10:00,W0010",header=TRUE)
结果:
# not showing the calculated columns
dat[-c(4:5)]
USER_ID SUBMISSION_DATE CONTRACT_REF TIME_DIFF
1 1 20/6 1:00 W001 0
2 1 20/6 2:00 W002 3600
3 1 20/6 3:30 W003 5400
4 4 20/6 4:00 W004 0
5 5 20/6 5:00 W005 0
6 5 20/6 6:00 W006 3600
7 7 20/6 7:00 W007 0
8 7 20/6 8:00 W008 3600
9 7 20/6 9:00 W009 3600
10 7 20/6 10:00 W0010 3600
这是一个稍微紧凑的版本(中间列更少)。请注意,使用“difftime”而不是“diff”可以让您选择时间单位(秒、分钟、小时等)
dat$DATE2小心unlist(taply(…)
但是-如果data.frame没有排序,它的顺序将不正确。是-排序数据是重要的第一步。
dat$SD_DATE <- as.numeric(with(dat,as.POSIXct(SUBMISSION_DATE,format="%d/%m %H:%M")))
dat$TIME_DIFF <- with(dat, ave(SD_DATE, USER_ID, FUN=function(x) c(0,diff(x)) ))
# not showing the calculated columns
dat[-c(4:5)]
USER_ID SUBMISSION_DATE CONTRACT_REF TIME_DIFF
1 1 20/6 1:00 W001 0
2 1 20/6 2:00 W002 3600
3 1 20/6 3:30 W003 5400
4 4 20/6 4:00 W004 0
5 5 20/6 5:00 W005 0
6 5 20/6 6:00 W006 3600
7 7 20/6 7:00 W007 0
8 7 20/6 8:00 W008 3600
9 7 20/6 9:00 W009 3600
10 7 20/6 10:00 W0010 3600
dat$DATE2 <- as.POSIXct(dat$SUBMISSION_DATE,format="%d/%m %H:%M")
getDtimes <- function(t) {
if(length(t)>0) c(0,difftime(t[-1], t[-length(t)], units="hours")) else(0)
}
dat$DTime <- unlist(with(dat, tapply(DATE2, USER_ID, getDtimes)))