在R中按序列分组

在R中按序列分组,r,time-series,grouping,R,Time Series,Grouping,我有以下数据帧 正如许多用户所建议的那样,我正在与dput分享这一点 > dput(time_interval_df) structure(list(timeinterval = structure(1:24, .Label = c("00:00:00 00:59:59", "01:00:00 01:59:59", "02:00:00 02:59:59", "03:00:00 03:59:59", "04:00:00 04:59:59", "05:00:00 05:59:59",

我有以下数据帧

正如许多用户所建议的那样,我正在与dput分享这一点

 > dput(time_interval_df)
structure(list(timeinterval = structure(1:24, .Label = c("00:00:00 00:59:59", 
"01:00:00 01:59:59", "02:00:00 02:59:59", "03:00:00 03:59:59", 
"04:00:00 04:59:59", "05:00:00 05:59:59", "06:00:00 06:59:59", 
"07:00:00 07:59:59", "08:00:00 08:59:59", "09:00:00 09:59:59", 
"10:00:00 10:59:59", "11:00:00 11:59:59", "12:00:00 12:59:59", 
"13:00:00 13:59:59", "14:00:00 14:59:59", "15:00:00 15:59:59", 
"16:00:00 16:59:59", "17:00:00 17:59:59", "18:00:00 18:59:59", 
"19:00:00 19:59:59", "20:00:00 20:59:59", "21:00:00 21:59:59", 
"22:00:00 22:59:59", "23:00:00 23:59:59"), class = "factor"), 
    timecount = c(1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 
    0, 0, 0, 0, 1, 0, 1, 1, 1)), .Names = c("timeinterval", "timecount"
), row.names = c(NA, -24L), class = "data.frame")
我的数据帧的结构是

str(time_interval_df)
'data.frame':   24 obs. of  2 variables:
 $ timeinterval: Factor w/ 24 levels "00:00:00 00:59:59",..: 1 2 3 4 5 6 7 8 9 10 ...
 $ timecount   : num  1 1 1 0 0 0 0 0 1 1 ...
如果时间间隔之间的差值为1,并且存在一些时间计数,则我希望将它们分组在单个组中。例如,行1和行2之间的差值为1,行2和行3之间的差值(连续)为1,因此我希望将所有数据分组为一,并在新行前面显示时间计数的总和,即。"00:00:00 02:59:59" 下面是我想要的输出

在获得第二个输出后,我的第二个期望结果将是


请在这方面帮助我。我在这方面花了很多时间。

我们可以使用
data.table
。将'data.frame'转换为'data.table'(
setDT(df1
)。通过拆分'timeinterval(
tstrsplit()
)创建两列('time1','time2')在空白处,按“timecount”的运行长度id分组,
如果“timecount”的所有值不等于0,则
分别粘贴“time1”和“time2”的第一个(
1
)和最后一个(
.N
)元素,并获取数字或行(
.N
)。如果需要,请将“grp”列指定为“NULL”

library(data.table)
res1 <- setDT(df1)[, c('time1', 'time2') := tstrsplit(timeinterval, " ")
     ][, if(all(timecount!=0)) .(timeinterval= paste(time1[1], time2[.N]), timecount = .N),
          .(grp = rleid(timecount))][, grp := NULL][]
res1
#        timeinterval timecount
#1: 00:00:00 02:59:59         3
#2: 08:00:00 09:59:59         2
#3: 14:00:00 14:59:59         1
#4: 19:00:00 19:59:59         1
#5: 21:00:00 23:59:59         3

我们可以使用
data.table
。将'data.frame'转换为'data.table'(
setDT(df1
)。通过拆分'timeinterval(
tstrsplit()
)创建两列('time1','time2')在空白处,按“timecount”的运行长度id分组,
如果“timecount”的所有值不等于0,则
分别粘贴“time1”和“time2”的第一个(
1
)和最后一个(
.N
)元素,并获取数字或行(
.N
)。如果需要,请将“grp”列指定为“NULL”

library(data.table)
res1 <- setDT(df1)[, c('time1', 'time2') := tstrsplit(timeinterval, " ")
     ][, if(all(timecount!=0)) .(timeinterval= paste(time1[1], time2[.N]), timecount = .N),
          .(grp = rleid(timecount))][, grp := NULL][]
res1
#        timeinterval timecount
#1: 00:00:00 02:59:59         3
#2: 08:00:00 09:59:59         2
#3: 14:00:00 14:59:59         1
#4: 19:00:00 19:59:59         1
#5: 21:00:00 23:59:59         3

这与你发布的@akrun yes类似,但你提供的解决方案不起作用,我的问题也不清楚。你能再帮我一次吗?我删除了之前的帖子,因为很多人投了反对票,因为它不可复制。你能分享你的完整代码吗?如果你根据我的数据进行调整,分享它会更好。比ks@akrun我没有对你的答案投反对票。你已经帮了我很多次了。我为什么要投反对票?这不是和你发布的@akrun yes类似吗?但是你提供的解决方案不起作用,我的问题有点不清楚。你能再帮我一次吗?我删除了之前的帖子,因为它没有重复性,所以有很多人投反对票你能分享你的完整代码吗?如果你能根据我的数据进行调整来分享会更好。Thanks@akrun我没有否决你的答案。你已经帮了我很多次了。我为什么要否决?非常感谢你。困惑在于如何划分时间间隔?你能解释一下吗?@user110244我使用了
tstrsplit
来做这件事。如果你对解决方案没问题,也请多谢你检查。问题是如何分割时间间隔?你能给这件事解释一下吗?@user110244我使用了
tstrsplit
来做这件事。如果你对解决方案没问题,也请检查一下