创建时间点不大于特定数字(R、Dplyr)的组并持续时间
我有一个数据帧df,我想在其中创建一个“组”,然后计算其持续时间,因为datetime序列不超过2分钟创建时间点不大于特定数字(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
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,否则只需添加一个值即可
您可以对数据进行子集划分并显示一个小的可重新审核示例,以便我可以对其进行测试吗