Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何使用r或sql计算每个组id的差异?_Mysql_R - Fatal编程技术网

Mysql 如何使用r或sql计算每个组id的差异?

Mysql 如何使用r或sql计算每个组id的差异?,mysql,r,Mysql,R,我正在寻找一种方法来计算每个组id的时间差。以下是我的部分数据: ID road beginTime endTime Mon Tue Wed Thu Fri Sat 666 757 9:00 AM 11:45 AM S 555 758 1:55 PM 3:45 PM M W 555 759 10:40 AM 12:30 PM M W 5

我正在寻找一种方法来计算每个组id的时间差。以下是我的部分数据:

ID  road    beginTime   endTime Mon Tue Wed Thu Fri Sat
666 757     9:00 AM     11:45 AM                    S
555 758     1:55 PM     3:45 PM  M       W          
555 759     10:40 AM    12:30 PM M       W          
555 760     4:00 PM     5:50 PM     Tue      R      
444 761     3:00 PM     4:25 PM     Tue      R      
444 762     4:30 PM     7:15 PM  M                  
444 763     12:50 PM    2:40 PM                 Fri 
444 764     10:40 AM    11:35 AM    Tue      R      
222 765     11:45 AM    2:30 PM  M      W           
222 766     6:00 PM     9:40 PM              R      
333 767     8:30 AM     11:15 AM M      W           
333 768     8:30 AM     11:15 AM    Tue      R      
333 769     1:25 PM     2:50 PM     Tue      R      
333 770     11:45 AM    1:10 PM  M      W           
dput()的输出:

每个ID在一天中的不同时间(开始时间、结束时间)在不同的道路上行驶。我想计算每个ID的等待(非驾驶)时间。例如,ID=555在周一和周三驾驶。第一节课是上午10:40到下午12:30。它等待了1.41个小时,然后在1:55-3:45之间又开始了一段时间。我需要1.41小时的等待时间。当这个id在周二和周四开车时,还有一个等待时间。对于ID=666,它只在周六行驶一段时间,因此等待时间为0。对于我的数据来说,困难在于每个ID每天都有不同的周期。有什么建议吗?非常感谢

使用我在评论中提到的“长”格式会让事情变得更简单

首先,我将清理一下您的数据:将因子转换为字符串,然后将字符串转换为时间(
df
是您的数据,如上所述的
dput
ed):

库(dplyr)
#小辅助函数
散光率%
每一个都发生变异(funs(astime)、beginTime、endTime)
主管(df2)
#ID路开始结束时间周一周二周三周四周五周六
#1666757 2016-06-21 09:00:00 2016-06-21 11:45:00 S
#2555758 2016-06-21 13:55:00 2016-06-21 15:45:00西方
#3555759 2016-06-21 10:40:00 2016-06-21 12:30:00西方
#45557602016-06-21 16:00:00 2016-06-21 17:50:00周二R
#5444761 2016-06-21 15:00:00 2016-06-21 16:25:00周二R
#6444762 2016-06-21 16:30:00 2016-06-21 19:15:00
(不要担心日期都错了,这应该被忽略。)现在我将从宽转换为长,并删除那些日期为空字符串的实例:

library(tidyr)
df3 <- df2 %>%
  gather(day, ign, Mon:Sat) %>%
  filter(ign != "") %>%
  select(-ign)
head(df3)
#    ID road           beginTime             endTime day
# 1 555  758 2016-06-21 13:55:00 2016-06-21 15:45:00 Mon
# 2 555  759 2016-06-21 10:40:00 2016-06-21 12:30:00 Mon
# 3 444  762 2016-06-21 16:30:00 2016-06-21 19:15:00 Mon
# 4 222  765 2016-06-21 11:45:00 2016-06-21 14:30:00 Mon
# 5 333  767 2016-06-21 08:30:00 2016-06-21 11:15:00 Mon
# 6 333  770 2016-06-21 11:45:00 2016-06-21 13:10:00 Mon
library(tidyr)
df3%
聚集(日、月、周一:周六)%>%
过滤器(ign!=“”)%>%
选择(-ign)
主管(df3)
#ID路开始时间结束时间日
#1555758 2016-06-21 13:55:00 2016-06-21 15:45:00周一
#2555759 2016-06-21 10:40:00 2016-06-21 12:30:00周一
#34444762 2016-06-21 16:30:00 2016-06-21 19:15:00周一
#422765 2016-06-21 11:45:00 2016-06-21 14:30:00周一
#5333767 2016-06-21 08:30:00 2016-06-21 11:15:00周一
#6333770 2016-06-21 11:45:00 2016-06-21 13:10:00周一
现在我将它们分组并计算等待时间:

df4 <- df3 %>%
  arrange(ID, day, beginTime) %>%
  group_by(ID, day) %>%
  mutate(
    waitTime = difftime(beginTime, dplyr::lag(endTime, default = beginTime[1]), units='secs')
  )
head(df4)
# Source: local data frame [6 x 6]
# Groups: ID, day [5]
#      ID  road           beginTime             endTime   day       waitTime
#   <int> <int>              <time>              <time> <chr> <S3: difftime>
# 1   222   765 2016-06-21 11:45:00 2016-06-21 14:30:00   Mon         0 secs
# 2   222   766 2016-06-21 18:00:00 2016-06-21 21:40:00   Thu         0 secs
# 3   222   765 2016-06-21 11:45:00 2016-06-21 14:30:00   Wed         0 secs
# 4   333   767 2016-06-21 08:30:00 2016-06-21 11:15:00   Mon         0 secs
# 5   333   770 2016-06-21 11:45:00 2016-06-21 13:10:00   Mon      1800 secs
# 6   333   768 2016-06-21 08:30:00 2016-06-21 11:15:00   Thu         0 secs
df4%
安排(ID、日期、开始时间)%>%
分组依据(ID,日期)%>%
变异(
waitTime=difftime(beginTime,dplyr::lag(endTime,default=beginTime[1]),units='secs')
)
主管(df4)
#来源:本地数据帧[6 x 6]
#组:ID,天[5]
#ID路开始时间结束时间白天等待时间
#                                  
#222765 2016-06-21 11:45:00 2016-06-21 14:30:00周一0秒
#222766 2016-06-21 18:00:00 2016-06-21 21:40:00周四0秒
#322765 2016-06-21 11:45:00 2016-06-21 14:30:00星期三0秒
#4333767 2016-06-21 08:30:00 2016-06-21 11:15:00周一0秒
#5333770 2016-06-21 11:45:00 2016-06-21 13:10:00周一1800秒
#6333768 2016-06-21 08:30:00 2016-06-21 11:15:00周四0秒
您可以方便地筛选有人等待的时间:

df4 %>%
  filter(waitTime > 0)
# Source: local data frame [8 x 6]
# Groups: ID, day [8]
#      ID  road           beginTime             endTime   day       waitTime
#   <int> <int>              <time>              <time> <chr> <S3: difftime>
# 1   333   770 2016-06-21 11:45:00 2016-06-21 13:10:00   Mon      1800 secs
# 2   333   769 2016-06-21 13:25:00 2016-06-21 14:50:00   Thu      7800 secs
# 3   333   769 2016-06-21 13:25:00 2016-06-21 14:50:00   Tue      7800 secs
# 4   333   770 2016-06-21 11:45:00 2016-06-21 13:10:00   Wed      1800 secs
# 5   444   761 2016-06-21 15:00:00 2016-06-21 16:25:00   Thu     12300 secs
# 6   444   761 2016-06-21 15:00:00 2016-06-21 16:25:00   Tue     12300 secs
# 7   555   758 2016-06-21 13:55:00 2016-06-21 15:45:00   Mon      5100 secs
# 8   555   758 2016-06-21 13:55:00 2016-06-21 15:45:00   Wed      5100 secs
df4%>%
过滤器(等待时间>0)
#来源:本地数据帧[8 x 6]
#组:ID,天[8]
#ID路开始时间结束时间白天等待时间
#                                  
#1333770 2016-06-21 11:45:00 2016-06-21 13:10:00周一1800秒
#233769 2016-06-21 13:25:00 2016-06-21 14:50:00周四7800秒
#333769 2016-06-21 13:25:00 2016-06-21 14:50:00周二7800秒
#4333770 2016-06-21 11:45:00 2016-06-21 13:10:00周三1800秒
#5444761 2016-06-21 15:00:00 2016-06-21 16:25:00周四12300秒
#6444761 2016-06-21 15:00:00 2016-06-21 16:25:00周二12300秒
#7 555 758 2016-06-21 13:55:00 2016-06-21 15:45:00周一5100秒
#8555758 2016-06-21 13:55:00 2016-06-21 15:45:00星期三5100秒
在这种情况下,您将看到您的ID 555示例在周一和周三有1.41小时(5100秒)的休息时间,ID 666没有等待时间。

使用我在评论中提到的“长”格式使事情变得更简单

首先,我将清理一下您的数据:将因子转换为字符串,然后将字符串转换为时间(
df
是您的数据,如上所述的
dput
ed):

库(dplyr)
#小辅助函数
散光率%
每一个都发生变异(funs(astime)、beginTime、endTime)
主管(df2)
#ID路开始结束时间周一周二周三周四周五周六
#1666757 2016-06-21 09:00:00 2016-06-21 11:45:00 S
#2555758 2016-06-21 13:55:00 2016-06-21 15:45:00西方
#3555759 2016-06-21 10:40:00 2016-06-21 12:30:00西方
#45557602016-06-21 16:00:00 2016-06-21 17:50:00周二R
#5444761 2016-06-21 15:00:00 2016-06-21 16:25:00周二R
#6444762 2016-06-21 16:30:00 2016-06-21 19:15:00
(不要担心日期都错了,这应该被忽略。)现在我将从宽转换为长,并删除那些日期为空字符串的实例:

library(tidyr)
df3 <- df2 %>%
  gather(day, ign, Mon:Sat) %>%
  filter(ign != "") %>%
  select(-ign)
head(df3)
#    ID road           beginTime             endTime day
# 1 555  758 2016-06-21 13:55:00 2016-06-21 15:45:00 Mon
# 2 555  759 2016-06-21 10:40:00 2016-06-21 12:30:00 Mon
# 3 444  762 2016-06-21 16:30:00 2016-06-21 19:15:00 Mon
# 4 222  765 2016-06-21 11:45:00 2016-06-21 14:30:00 Mon
# 5 333  767 2016-06-21 08:30:00 2016-06-21 11:15:00 Mon
# 6 333  770 2016-06-21 11:45:00 2016-06-21 13:10:00 Mon
library(tidyr)
df3%
聚集(日、月、周一:周六)%>%
过滤器(ign!=“”)%>%
选择(-ign)
主管(df3)
#ID路开始时间结束时间日
#1555758 2016-06-21 13:55:00 2016-06-21 15:45:00周一
#2555759 2016-06-21 10:40:00 2016-06-21 12:30:00周一
#34444762 2016-06-21 16:30:00 2016-06-21 19:15:00周一
#422765 2016-06-21 11:45:00 2016-06-21 14:30:00周一
#5333767 2016-06-21 08:30:00 2016-06-21 11:15:00周一
#6333770 2016-06-21 11:45:00 2016-06-21 13:10:00周一
现在我将它们分组并计算等待时间:

df4 <- df3 %>%
  arrange(ID, day, beginTime) %>%
  group_by(ID, day) %>%
  mutate(
    waitTime = difftime(beginTime, dplyr::lag(endTime, default = beginTime[1]), units='secs')
  )
head(df4)
# Source: local data frame [6 x 6]
# Groups: ID, day [5]
#      ID  road           beginTime             endTime   day       waitTime
#   <int> <int>              <time>              <time> <chr> <S3: difftime>
# 1   222   765 2016-06-21 11:45:00 2016-06-21 14:30:00   Mon         0 secs
# 2   222   766 2016-06-21 18:00:00 2016-06-21 21:40:00   Thu         0 secs
# 3   222   765 2016-06-21 11:45:00 2016-06-21 14:30:00   Wed         0 secs
# 4   333   767 2016-06-21 08:30:00 2016-06-21 11:15:00   Mon         0 secs
# 5   333   770 2016-06-21 11:45:00 2016-06-21 13:10:00   Mon      1800 secs
# 6   333   768 2016-06-21 08:30:00 2016-06-21 11:15:00   Thu         0 secs