首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >计算R中的累积时间

计算R中的累积时间
EN

Stack Overflow用户
提问于 2017-07-14 03:44:39
回答 2查看 1.4K关注 0票数 2

我有一个数据帧,看起来像这样:

代码语言:javascript
复制
     POI   LOCAL.DATETIME
1    1     2017-07-11 15:02:13
2    1     2017-07-11 15:20:28
3    2     2017-07-11 15:20:31
4    2     2017-07-11 15:21:13
5    3     2017-07-11 15:21:18
6    3     2017-07-11 15:21:21
7    2     2017-07-11 15:21:25
8    2     2017-07-11 15:21:59
9    1     2017-07-11 15:22:02
10   1     2017-07-11 15:22:05

我希望能够计算(可能使用lubridate)在每个POI上花费的累积时间,并将它们合并到一个类似于以下内容的表中:

代码语言:javascript
复制
     POI   TOTAL.TIME
1    1     00:18:18
2    2     00:01:11
3    3     00:00:03

此外,我不确定如何处理POI之间的时间,如第2行和第3行之间的3秒。我认为我可能需要计算第1行到第3行的时间,而不是第1行到第2行的时间。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-07-14 03:52:18

要获取每个组周期内的总时间,首先需要创建一个组索引。我正在使用data.table中的rleid,然后您可以计算在每个组中花费的总时间,然后使用sum汇总初始POI。

代码语言:javascript
复制
df <- read.table(text="     POI   LOCAL.DATETIME
1     '2017-07-11 15:02:13'
1     '2017-07-11 15:20:28'
2     '2017-07-11 15:20:31'
2     '2017-07-11 15:21:13'
3     '2017-07-11 15:21:18'
3     '2017-07-11 15:21:21'
2     '2017-07-11 15:21:25'
2     '2017-07-11 15:21:59'
1     '2017-07-11 15:22:02'
1     '2017-07-11 15:22:05'",
                 header=TRUE,stringsAsFactors=FALSE)
df$LOCAL.DATETIME <- as.POSIXct(df$LOCAL.DATETIME)

library(dplyr)
df%>%
  mutate(grp=data.table::rleid(POI))%>%
  group_by(grp)%>%
  summarise(POI=max(POI),TOTAL.TIME=difftime(max(LOCAL.DATETIME),
                                     min(LOCAL.DATETIME),units="secs"))%>%
  group_by(POI)%>%
  summarise(TOTAL.TIME=sum(TOTAL.TIME))

# A tibble: 3 × 2
    POI TOTAL.TIME
  <int>     <time>
1     1  1098 secs
2     2    76 secs
3     3     3 secs

要获取分钟和秒,可以使用lubridate中的as.period

代码语言:javascript
复制
library(lubridate)
df%>%
  mutate(grp=data.table::rleid(POI))%>%
  group_by(grp)%>%
  summarise(POI=max(POI),TOTAL.TIME=difftime(max(LOCAL.DATETIME),
                                    min(LOCAL.DATETIME),units="secs"))%>%
  group_by(POI)%>%
  summarise(TOTAL.TIME=sum(TOTAL.TIME))%>%
  mutate(TOTAL.TIME =as.period((TOTAL.TIME), unit = "sec"))

    POI   TOTAL.TIME
  <int> <S4: Period>
1     1      18M 18S
2     2       1M 16S
3     3           3S
票数 2
EN

Stack Overflow用户

发布于 2017-07-14 04:29:13

另一个data.table选项是为每个POI创建两行的分组,取它们之间的时间差,最后用POI求和

代码语言:javascript
复制
library(data.table)

dt <- as.data.table(df)
dt[, grp2 := (seq_len(.N)+1) %/% 2, by = POI]
dt[, time_diff := difftime(LOCAL.DATETIME, shift(LOCAL.DATETIME), unit = "min"), by = .(POI, grp2)]
dt[ , .(TOTAL.TIME = sum(time_diff, na.rm = T)), by = POI]

#   POI     TOTAL.TIME
#1:   1 18.300000 mins
#2:   2  1.266667 mins
#3:   3  0.050000 mins
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45089710

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档