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