我有一个数据框如下
tmpdf <- data.frame(licensePlate = c("Y80901", "Y80901", "Y80901", "AMG-999", "AMG-999", "W3188", "W3188"),
starttime= c("2015-09-18 09:55", "2015-09-18 23:00", "2015-09-20 15:00", "2015-09-17 15:42", "2015-09-21 09:22", "2015-09-17 09:00", "2015-09-21 14:00"),
endtime = c("2015-09-18 17:55", "2015-09-20 11:00", "2015-09-21 12:00", "2015-09-18 13:00", "2015-09-21 14:22", "2015-09-21 12:00", "2015-09-21 16:00"))
tmpdf
licensePlate starttime endtime
1 Y80901 2015-09-18 09:55 2015-09-18 17:55
2 Y80901 2015-09-18 23:00 2015-09-20 11:00
3 Y80901 2015-09-20 15:00 2015-09-21 12:00
4 AMG-999 2015-09-17 15:42 2015-09-18 13:00
5 AMG-999 2015-09-21 09:22 2015-09-21 14:22
6 W3188 2015-09-17 09:00 2015-09-21 12:00
7 W3188 2015-09-21 14:00 2015-09-21 16:00
我想计算每个licensePlate每天使用的最后n天(例如,从9月17日到9月21日的最后5天),我的预期结果如下:
Period LicensePlate Used Time
1 2015-09-17 Y80901 0
2 2015-09-17 AMG-999 8.3
3 2015-09-17 W3188 15
4 2015-09-18 Y80901 9
5 2015-09-18 AMG-999 13
6 2015-09-18 W3188 24
7 2015-09-19 Y80901 24
8 2015-09-19 AMG-999 0
9 2015-09-19 W3188 24
10 2015-09-20 Y80901 20
11 2015-09-20 AMG-999 0
12 2015-09-20 W3188 24
13 2015-09-21 Y80901 12
14 2015-09-21 AMG-999 5
15 2015-09-21 W3188 14
我认为dplyr / data.table和lubridate可用于获取我的结果,我可能需要以天为单位测量时间段,但我不知道如何在开始/结束时间间隔内开始/结束时切入行 .
4 回答
这是让你入门的东西 . 这几乎是您想要的输出,因为它没有显示每个时期缺少的
licensePlate
.第一步是将您的日期转换为有效的
POSIXct
类,然后将数据扩展到每分钟级别(可能是此解决方案中成本最高的部分),并将licensePlate
和Period
汇总,同时总结结果(我是这里没有使用as.Date
因为它处理的值非常糟糕,值在00和凌晨1点之间 .深吸一口气 . 这是我的解决方案
初始化数据
数据准备
要执行所需的操作,必须将完整的使用数据转换为每日使用数据 . 所以我编写了以下函数来将数据准备为所需的格式 .
准备好的数据
我们准备的数据
数据操作
现在我们创建一个新的DF,它代表所需格式的数据 . 这将最初在UsedTime列中具有空值 .
现在,newDF的每一行都有一个简单的mapply函数,在preparedData df中搜索正确的用法数据 .
我不得不限制解释以保持答案简短 . 如果您在评论中需要任何澄清,请与我们联系 .
你是对的,plyr可以用来解决这个问题 . 一种可能的方案:
希望能帮助到你!
试试这个 - 它有帮助吗?