Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/81.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
R 计算分组行集合中经过的时间_R_Datetime - Fatal编程技术网

R 计算分组行集合中经过的时间

R 计算分组行集合中经过的时间,r,datetime,R,Datetime,我知道有很多stackoverflow页面询问如何计算行之间的日期时间差,但我没有找到一个页面回答我的特定问题。大多数人对后续行之间的数据感兴趣,但我需要为一系列个体计算每个个体经过了多少时间。比如说 id time (of the day) 1 12:00:40 1 12:06:35 1 12:12:00 2 14:59:22 2 15:10:40 我想计算如下: id total time (second

我知道有很多stackoverflow页面询问如何计算行之间的日期时间差,但我没有找到一个页面回答我的特定问题。大多数人对后续行之间的数据感兴趣,但我需要为一系列个体计算每个个体经过了多少时间。比如说

id      time (of the day)
1       12:00:40
1       12:06:35
1       12:12:00
2       14:59:22
2       15:10:40
我想计算如下:

   id      total time (seconds)
    1       760
    2       678

提前感谢您的帮助,如果在其他地方得到了答复,我很抱歉,我无法找到它。

数据。表方法

首先将时间字符串设置为POSIXct格式,这样您就可以使用像
difftime
这样的函数。当一个id的时间跨度超过1天(比如从22小时到02小时)时,这就很方便了 第二步是计算最小时间值和最大时间值之间的difftime(以秒为单位)(按id组)

库(data.table)

dt一个完整的基R方法

aggregate(time~id, transform(df, time = as.POSIXct(time, format = "%H:%M:%S")), 
                   function(x) sum(as.numeric(diff(x), "secs")))

#  id time
#1  1  680
#2  2  678

使用
dplyr
lubridate
,我们首先将
time
转换为
Period
类,并将其转换为秒,然后取其差值的

library(dplyr)
library(lubridate)

df %>%
  group_by(id) %>%
  summarise(total_time = sum(diff(seconds(hms(time)))))


#    id   total_time
#   <int>      <dbl>
#1     1        680
#2     2        678
库(dplyr)
图书馆(lubridate)
df%>%
分组依据(id)%>%
总结(总时间=总和(差异(秒)(hms(时间)ЮЮЮ)
#id总时间
#         
#1     1        680
#2     2        678

假设您使用的是
data.table
,另一种选择可能是使用它的
ITime
类,该类是基于秒的:
dt[,time:=as.ITime(time)]
dt[,max(time)-min(time),id]
@Henrik从未听说过那个类。每天学习更多,谢谢!
library(dplyr)
library(lubridate)

df %>%
  group_by(id) %>%
  summarise(total_time = sum(diff(seconds(hms(time)))))


#    id   total_time
#   <int>      <dbl>
#1     1        680
#2     2        678