我正试图从这样的数据中得出小时持续时间
df1=data.frame(Start=c("18:12","18:42","20:12","22:30"),
End=c("18:30","20:00","22:30","22:36"),
Duration (hour)=c(0.3,1.3,2.3,0.1))
| 开始|完|持续时间(小时)|
| - ------|- ------|- ------|
| 十八点十二分|十八点半|0.3分|
| 十八点四十二分|晚上八点整|1.3岁|
| 20点12分|22点半|二、三|
| 22点半|二十二点三十六分|0.1分|
例如:在18-19时持续时间=0.6,因为0.3 +(18:42-19:00)在19-20时= 1,20-21时= 0.8(没有20:00-20:12(0.2)),21-22时= 1,22-23时= 0.6(在22:36时停止)
我期待这样
| 时钟|持续时间(小时)|
| - ------|- ------|
| 十八至十九岁|0.6分|
| 19岁至20岁|1个|
| 二十至二十一岁|0.8分|
| 二十一至二十二岁|1个|
| 二十二至二十三岁|0.6分|
2条答案
按热度按时间hs1ihplo1#
下面我使用
dplyover::over()
中的自定义函数calc_time()
为每个小时创建虚拟变量。我们可以将自定义函数 Package 在dplyr::summarise()
中的sum
中,以获得每个小时的总计数,然后我们只需要pivot_longer()
:数据来自OP
免责声明:我是{dplyover}的维护者,它不在CRAN上。
创建于2023年3月8日,使用reprex v2.0.2
7nbnzgx92#
这是另一个完全基于
dplyr
的解决方案。我将时间转换为datetime
对象,并创建了一个Start
和End
之间的序列,间隔为1分钟。然后,如果下一个小时的0分钟存在,我也计算前一个小时的行数,否则,只计算行数(参见
mutate(val = if_else(...
;)。这有一个缺陷,因为如果我们没有完整的小时,但有一个小时的开始或下一个小时的开始,那么我们将计数前一个小时和下一个小时,而我们不应该这样做。因此,我检查是否完整的小时存在或如果这个小时的开始和下一个小时不存在,如果是,我只是扣除1,否则我从总和扣除2。我创建了一个数据框来显示所有可能的情况。