在R中按序列分组
我有以下数据帧 正如许多用户所建议的那样,我正在与dput分享这一点在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(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
来做这件事。如果你对解决方案没问题,也请检查一下