dplyr按组汇总,同时跨日期和增量分配小时

dplyr按组汇总,同时跨日期和增量分配小时,r,datetime,dplyr,mutate,summarization,R,Datetime,Dplyr,Mutate,Summarization,我有一个带有时间表数据的df,正在寻找一个简单的方法来总结它。我的数据看起来像df1,我想将其总结为df2。我很难想出一种方法来创建增量,并在它们之间分配时间。棘手的部分是分配跨越日期的小时数,例如ID 1和ID 3 df1 ID车库单元\u名称开始\u日期\u时间结束\u日期\u时间 1辆卡车2015年1月26日21:00 2015年1月27日7:00 2 B卡车2015年5月13日6:00 2015年5月13日16:00 3 C车2015年8月21日21:00 2015年8月22日7:00

我有一个带有时间表数据的df,正在寻找一个简单的方法来总结它。我的数据看起来像df1,我想将其总结为df2。我很难想出一种方法来创建增量,并在它们之间分配时间。棘手的部分是分配跨越日期的小时数,例如ID 1和ID 3

df1

ID车库单元\u名称开始\u日期\u时间结束\u日期\u时间
1辆卡车2015年1月26日21:00 2015年1月27日7:00
2 B卡车2015年5月13日6:00 2015年5月13日16:00
3 C车2015年8月21日21:00 2015年8月22日7:00
6 C车2015年8月21日11:00 2015年8月21日21:00
结构(列表ID=c(“,“1”,“2”,“3”,“6”),NA,NA,NA,
NA,NA,NA),车库=c(“,“A”,“B”,“c”,“c”,NA,NA,
不适用,不适用,不适用),单位名称=c(“,”卡车“,”卡车“,”汽车“,
“汽车”,不适用,不适用,不适用,不适用),开始日期时间=c(“,
"1/26/2015 21:00", "5/13/2015 6:00", "8/21/2015 21:00", "8/21/2015 11:00", 
不适用,不适用,不适用,不适用,不适用),结束日期时间=c(“,”2015年1月27日7:00“,
“2015年5月13日16:00”、“2015年8月22日7:00”、“2015年8月21日21:00”,北美,北美,
NA,NA,NA,NA)),.Names=c(“ID”、“车库”、“单位名称”、“开始日期”和“时间”,
“结束日期时间”),row.names=c(NA,-11L),class=c(“待定”,
“tbl”,“data.frame”),spec=结构(list)(cols=结构(list(
ID=structure(list(),class=c(“收集器\字符”,“收集器”
)),Garage=structure(list(),class=c(“收集器字符”,
“收集器”)),单元名称=结构(列表(),类=c(“收集器字符”,
“收集器”)),开始日期时间=结构(列表(),类=c(“收集器字符”,
“收集器”)),结束日期时间=结构(列表(),类=c(“收集器字符”,
“收集器”)),.Names=c(“ID”、“车库”、“单元名称”、“开始日期”和“时间”,
“结束日期时间”),默认值=结构(列表(),类=c(“收集器”,
“收集器”)),.Names=c(“cols”,“default”),class=“col_spec”))
df2

车库单元名称日期增量小时数
卡车2015年1月26日18:01-00:00 3
卡车2015年1月27日00:01-6:00 6
卡车2015年1月27日6:01-12:00 1
B卡车2015年5月13日6:01-12:00 6
B卡车5/13/2015 12:01-18:00 4
C车2015年8月21日6:01-12:00 1
C车8/21/2015 12:01-18:00 6
C车2015年8月21日18:01-00:00 6
C车2015年8月22日00:01-6:00 6
C车2015年8月23日6:01-12:00 1
库(tidyverse)
图书馆(lubridate)
时间=c(“00:00”、“06:00”、“12:00”、“18:00”)
时间1=c(“00:01”、“06:01”、“12:01”、“18:01”)
df1%>%
组员(车库、单位名称)%>%
变异(大小=n())%>%
总结(开始日期时间=分钟(开始日期时间),
结束日期时间=最大值(结束日期时间))%>%
变异(S=mdy\U hm(开始日期时间),
b=楼层(小时)/24*4)+1,
m=ymd_hm(粘贴(格式为S,%F),获取(“时间,.GlobalEnv)[b]),
n=ymd_hm(粘贴(格式为S,“%F”)、获取(“时间”、.GlobalEnv)[(b+1)%%4%>%替换(,..==0,4)])%%>%
如果(m>,.+天(1),),
rem=数值形式(mdy\u hm(结束日期\u时间)-n),
小时数=列表(如数字(c(n-S,代表(6,rem%%/%6),rem%%6)))%>%
unest()%>%
变异(日期=S+小时(累计(滞后(小时,默认值=0)),
b=楼层(小时(日期)/24*4)+1,
增量=粘贴0(获取(“times1”,.GlobalEnv)[b],“-”,
获取(“次”,.GlobalEnv)[替换(d%
选择(车库、日期、小时、增量)
组别:车库[3]
车库日期小时数增加
1A 2015-01-26 3.18:01-00:00
2A 2015-01-27 6.00:01-06:00
3A 2015-01-27 1.06:01-12:00
4B 2015-05-13 6.06:01-12:00
5b 2015-05-13 4.12:01-18:00
6c 2015-08-21 1.06:01-12:00
7 C 2015-08-216.12:01-18:00
8 C 2015-08-216.18:01-00:00
9 C 2015-08-22 6.00:01-06:00
10 C 2015-08-22 1.06:01-12:00

能否请您编辑问题以给出
df1
dput()
,这样我们就不必重新键入数据?请参阅问题中添加的数据开始和结束日期是否会超过2天?否,开始和结束日期不会超过一天谢谢您的方法!运行代码时,我收到一个错误:mutate_impl(.data,dots)中出错:计算错误:“times”参数无效。"我想这是在if_else语句中抛出的。关于如何处理,有什么建议吗?@samuelt你能试着把代码运行到m吗?我的意思是关闭m处的paradensis并运行代码的上半部分..然后看看它是否运行..因为在我的结尾它确实运行..没有错误括号应该在m结尾的
之前nedid,并且第一个mutate函数的所有部分都运行良好。抛出错误的是if-else语句,现在尝试运行,直到mutate结束..没有任何不必要的错误
ID    Garage  Unit_Name START_DATE_TIME  END_DATE_TIME
<chr> <chr>   <chr>     <dttm>           <dttm>
1     A       Truck     1/26/2015 21:00  1/27/2015 7:00
2     B       Truck     5/13/2015 6:00   5/13/2015 16:00
3     C       Car       8/21/2015 21:00  8/22/2015 7:00
6     C       Car       8/21/2015 11:00  8/21/2015 21:00


structure(list(ID = c("<chr>", "1", "2", "3", "6", NA, NA, NA, 
NA, NA, NA), Garage = c("<chr>", "A", "B", "C", "C", NA, NA, 
NA, NA, NA, NA), Unit_Name = c("<chr>", "Truck", "Truck", "Car", 
"Car", NA, NA, NA, NA, NA, NA), START_DATE_TIME = c("<dttm>", 
"1/26/2015 21:00", "5/13/2015 6:00", "8/21/2015 21:00", "8/21/2015 11:00", 
NA, NA, NA, NA, NA, NA), END_DATE_TIME = c("<dttm>", "1/27/2015 7:00", 
"5/13/2015 16:00", "8/22/2015 7:00", "8/21/2015 21:00", NA, NA, 
NA, NA, NA, NA)), .Names = c("ID", "Garage", "Unit_Name", "START_DATE_TIME", 
"END_DATE_TIME"), row.names = c(NA, -11L), class = c("tbl_df", 
"tbl", "data.frame"), spec = structure(list(cols = structure(list(
    ID = structure(list(), class = c("collector_character", "collector"
    )), Garage = structure(list(), class = c("collector_character", 
    "collector")), Unit_Name = structure(list(), class = c("collector_character", 
    "collector")), START_DATE_TIME = structure(list(), class = c("collector_character", 
    "collector")), END_DATE_TIME = structure(list(), class = c("collector_character", 
    "collector"))), .Names = c("ID", "Garage", "Unit_Name", "START_DATE_TIME", 
"END_DATE_TIME")), default = structure(list(), class = c("collector_guess", 
"collector"))), .Names = c("cols", "default"), class = "col_spec"))
Garage  Unit_Name   Date        Increment    Hours
<chr>   <chr>       <dttm>      <chr>        <dbl>
A       Truck       1/26/2015   18:01-00:00   3
A       Truck       1/27/2015   00:01-6:00    6
A       Truck       1/27/2015   6:01-12:00    1
B       Truck       5/13/2015   6:01-12:00    6
B       Truck       5/13/2015   12:01-18:00   4
C       Car         8/21/2015   6:01-12:00    1
C       Car         8/21/2015   12:01-18:00   6
C       Car         8/21/2015   18:01-00:00   6
C       Car         8/22/2015   00:01-6:00    6
C       Car         8/23/2015   6:01-12:00    1 
library(tidyverse)
library(lubridate)
times=c("00:00","06:00","12:00","18:00")
times1=c("00:01","06:01","12:01","18:01")
df1%>%
  group_by(Garage,Unit_Name)%>%
  mutate(size=n())%>%
  summarise(START_DATE_TIME=min(START_DATE_TIME),
            END_DATE_TIME=max(END_DATE_TIME))%>%
  mutate(S=mdy_hm(START_DATE_TIME),
         b=floor(hour(S)/24*4)+1,
         m=ymd_hm(paste(format(S,"%F"),get("times",.GlobalEnv)[b])),
         n=ymd_hm(paste(format(S,"%F"),get("times",.GlobalEnv)[(b+1)%%4%>%replace(.,.==0,4)]))%>%
           if_else(m>.,.+days(1),.),
         rem=as.numeric(mdy_hm(END_DATE_TIME)-n),
         HOURS=list(as.numeric(c(n-S,rep(6,rem%/%6),rem%%6))))%>%
  unnest()%>%
  mutate(Date=S+hours(cumsum(lag(HOURS,default = 0))),
         b=floor(hour(Date)/24*4)+1,
         increament=paste0(get("times1",.GlobalEnv)[b],"-",
                           get("times",.GlobalEnv)[replace(d<-(b+1)%%4,d==0,4)]),
         Date=as.Date(Date))%>%
  select(Garage,Date,HOURS,increament)

Groups:   Garage [3]
   Garage Date       HOURS increament 
   <chr>  <date>     <dbl> <chr>      
 1 A      2015-01-26    3. 18:01-00:00
 2 A      2015-01-27    6. 00:01-06:00
 3 A      2015-01-27    1. 06:01-12:00
 4 B      2015-05-13    6. 06:01-12:00
 5 B      2015-05-13    4. 12:01-18:00
 6 C      2015-08-21    1. 06:01-12:00
 7 C      2015-08-21    6. 12:01-18:00
 8 C      2015-08-21    6. 18:01-00:00
 9 C      2015-08-22    6. 00:01-06:00
10 C      2015-08-22    1. 06:01-12:00