创建时间点不大于特定数字(R、Dplyr)的组并持续时间

创建时间点不大于特定数字(R、Dplyr)的组并持续时间,r,dataframe,dplyr,R,Dataframe,Dplyr,我有一个数据帧df,我想在其中创建一个“组”,然后计算其持续时间,因为datetime序列不超过2分钟 DateA 5:00:01 PM 5:00:02 PM 5:00:03 PM 5:00:04 PM 5:01:26 PM 5:01:27 PM 5:01:28 PM 5:01:30 PM 5:02:55 PM 5:02:56 PM 5:10:01 PM 这就是我想要的结果: Group Duration a 3 sec

我有一个数据帧df,我想在其中创建一个“组”,然后计算其持续时间,因为datetime序列不超过2分钟

DateA

5:00:01 PM
5:00:02 PM
5:00:03 PM
5:00:04 PM 
5:01:26 PM 
5:01:27 PM
5:01:28 PM 
5:01:30 PM
5:02:55 PM
5:02:56 PM
5:10:01 PM
这就是我想要的结果:

Group             Duration

  a                  3 sec 
  b                  4 sec
  c                  1 sec
  d                  0 sec
其中,5:00:01、5:00:02、5:00:03和5:00:4的日期时间分组为 其中5:01:26、5:01:27、5:01:28、5:01:30的日期时间分组为b 其中,5:02:55、5:02:56的日期时间分组为c 其中,5:10:01的日期时间分组为d

Here is my dput:

structure(list(DateA = structure(c(1L, 2L, 2L, 3L, 4L, 5L, 6L, 
7L, 8L, 9L, 10L, 11L), .Label = c("5:00:01", "5:00:02", "5:00:03", 
"5:00:04", "5:01:26", "5:01:27", "5:01:28", "5:01:30", "5:02:55", 
"5:02:56", "5:10:01"), class = "factor")), class = "data.frame", row.names = c(NA, 
-12L))
这就是我尝试过的,但是,我不确定如何修改代码,使DateA列与thresh组合在一起

library(dplyr)
thresh <- 2

df %>%  
mutate(DateA = mdy_hms(DateA)) %>%
group_by(DateA, Group = cumsum(difftime(DateA, 
lag(DateA, default = first(DateA)), 
units = "mins") > thresh)) %>% summarise(Duration = 
difftime(max(DateAC), min(DateA), units = "secs")) %>%
ungroup %>%
mutate(Group = paste0('a', row_number()))
库(dplyr)
脱粒率%
突变(DateA=mdy_hms(DateA))%>%
分组依据(DateA,组=累计(difftime)(DateA,
滞后(DateA,默认值=第一个(DateA)),
units=“mins”)>thresh))%>%总结(持续时间=
difftime(最大值(DateAC),最小值(DateA),单位=“秒”)%>%
解组%>%
变异(组=粘贴0('a',行号()))

我们可以使用
setDT
转换为
数据。表
,将“DateA”更改为时间对象,通过执行逻辑表达式的
diff
累积和创建“组”,并使用
difftime
计算
max
min
之间的“秒”差

library(data.table)
setDT(df)[, DateA := as.ITime(as.character(DateA))][, 
   .(Duration = difftime(max(as.POSIXct(DateA)), min(as.POSIXct(DateA)), 
     unit = 'sec')),.(group = letters[cumsum(c(TRUE, diff(DateA) > thresh))])]
#   group Duration
#1:     a   3 secs
#2:     b   4 secs
#3:     c   1 secs
#4:     d   0 secs

或者,我们可以将分组从
diff
更改为
difftime
,以避免
单元中的任何不一致

setDT(df)[, DateA := as.ITime(as.character(DateA))][, 
         .(Duration = difftime(max(as.POSIXct(DateA)), min(as.POSIXct(DateA)), 
      unit = 'sec')), .(group = letters[cumsum(c(TRUE, 
      difftime(DateA[-1], DateA[-.N], unit = "min") > thresh))])]

它是3 4,1,0秒
库(data.table);setDT(df)[,DateA:=as.ITime(as.character(DateA))][,(Duration=difftime(last(as.POSIXct(DateA)),first(as.POSIXct(DateA)),unit='sec'),(group=letters[cumsum(c(TRUE,diff(DateA)>thresh))][/code>是的,很抱歉我会更新OK,让我试试这个。@TanishaHudson新组的创建是因为values@TanishaHudson不您不会得到相同的输出,因为每当差值大于1时,
cumsum
将添加一个新组,并且在thresh提到的情况下为2。它大于2,iit加上一个group@TanishaHudson你是用秒还是分钟来比较thresh@TanishaHudson可能有一些组只有一行。如果是这种情况,您可以创建一个条件,即
if(.N>1)执行difftime,否则只需添加一个值即可
您可以对数据进行子集划分并显示一个小的可重新审核示例,以便我可以对其进行测试吗