识别时间序列中的中断,并为R中的每个中断分配唯一的因子

识别时间序列中的中断,并为R中的每个中断分配唯一的因子,r,time,split,R,Time,Split,我得到了每数百艘船只的船只轨迹时间序列数据的大df。时间序列是多年的,因此每艘船都有多条航迹。每个“轨迹”都是每小时一次的数据,在时间序列中有很大的间隔(>天),我希望用它来识别每艘船的每个轨迹 我的计划是使用一个循环,首先选择船只及其整个时间序列,然后确定每个船只的唯一轨迹,然后将每个选定船只的单独轨迹拆分(成一个列表),然后进行一些数学运算,取消拆分,并附加到所有船只的新数据框中。我无法确定如何为split()的每个已标识轨迹指定唯一因子。一些简化的数据是 vessel<-c(rep(

我得到了每数百艘船只的船只轨迹时间序列数据的大df。时间序列是多年的,因此每艘船都有多条航迹。每个“轨迹”都是每小时一次的数据,在时间序列中有很大的间隔(>天),我希望用它来识别每艘船的每个轨迹

我的计划是使用一个循环,首先选择船只及其整个时间序列,然后确定每个船只的唯一轨迹,然后将每个选定船只的单独轨迹拆分(成一个列表),然后进行一些数学运算,取消拆分,并附加到所有船只的新数据框中。我无法确定如何为split()的每个已标识轨迹指定唯一因子。一些简化的数据是

vessel<-c(rep("A",11))
time <- as.POSIXct(c("2017-01-01 00:02:25 GMT", "2017-01-01 01:31:26 GMT", "2017-01-01 02:37:42 GMT",
                     "2017-01-01 03:14:34 GMT", "2017-01-01 04:09:45 GMT", "2017-02-01 05:51:53 GMT",
                     "2017-03-01 06:22:24 GMT", "2017-03-01 07:34:44 GMT","2017-03-01 08:01:15 GMT",
                     "2017-03-01 09:16:44 GMT", "2017-03-01 10:48:12 GMT")) 

df<-data.frame(vessel,time)
第二个轨迹从第7行开始,但由于与前一行的时间差,它被标识为FALSE。但是,它需要标记为下一个曲目的一部分


而且,所有这些都是通过空间数据帧来完成的,所以我认为这是可以做到的,但我可能在这方面错了。我可以提取数据,并重新创建空间数据框架,没有问题。谢谢。

这里是一个带有
数据表的选项。根据“over_thresh”创建一个带有
rleid
的分组索引,按“vessel”分组,然后将“split_factor”创建为带有“delete”字符串的列。获取在“over_thresh”中有
任何
元素的行的索引(
.I
),这些元素按“vesser”、“grp”分组,在
I
中使用,获取组索引(
.grp
)并粘贴子字符串
split
,以分配
I
中的行元素作为“split_因子”

library(data.table)
setDT(df)[, grp := rleid(over_thresh|shift(over_thresh, type = 'lead')), vessel]
df[, split_factor := 'delete']
i1 <- df[, .I[any(over_thresh)], .(vessel, grp)]$V1
df[i1, split_factor := paste0('split_', .GRP), .(vessel, grp)][, grp := NULL][]
#     vessel                time         gap over_thresh split_factor
# 1:      A 2017-01-01 00:02:25   0.0000000        TRUE      split_1
# 2:      A 2017-01-01 01:31:26   1.4836111        TRUE      split_1
# 3:      A 2017-01-01 02:37:42   1.1044444        TRUE      split_1
# 4:      A 2017-01-01 03:14:34   0.6144444        TRUE      split_1
# 5:      A 2017-01-01 04:09:45   0.9197222        TRUE      split_1
# 6:      A 2017-02-01 05:51:53 745.7022222       FALSE       delete
# 7:      A 2017-03-01 06:22:24 672.5086111       FALSE      split_2
# 8:      A 2017-03-01 07:34:44   1.2055556        TRUE      split_2
# 9:      A 2017-03-01 08:01:15   0.4419444        TRUE      split_2
#10:      A 2017-03-01 09:16:44   1.2580556        TRUE      split_2
#11:      A 2017-03-01 10:48:12   1.5244444        TRUE      split_2

因为这是下一条赛道的开始。谢谢。然而,我不知道如何创建df$split_factor列。我不熟悉data.table,但代码似乎假设df$split_factor已经存在?@user2175481抱歉,您的问题不清楚。我以为你想要创建“分割因子”列,代码正在这样做啊-好的,我现在看到了。我认为窗口没有完全加载。@user2175481可能是浏览器中的某些差异。不确定。在显示和字体上似乎也有变化,所以我最近注意到了。我正在使用firefox,它显示了整个页面,尽管我遇到了一个错误-我只使用了一个ship(shipID),并且我已经检查了测试数据中是否没有NAs<代码>错误:
mutate()`input
split\u factor
有问题。在下标作业中不允许x NAs,我输入
split_factor
is
inverse.rle(…)
。i组1中出现错误:shipID=674498`
vessel                time         gap       over_thresh  split_factor
1       A 2017-01-01 00:02:25   0.0000000        TRUE      split_1
2       A 2017-01-01 01:31:26   1.4836111        TRUE      split_1
3       A 2017-01-01 02:37:42   1.1044444        TRUE      split_1
4       A 2017-01-01 03:14:34   0.6144444        TRUE      split_1
5       A 2017-01-01 04:09:45   0.9197222        TRUE      split_1
6       A 2017-02-01 05:51:53 745.7022222       FALSE       delete
7       A 2017-03-01 06:22:24 672.5086111       FALSE      split_2
8       A 2017-03-01 07:34:44   1.2055556        TRUE      split_2
9       A 2017-03-01 08:01:15   0.4419444        TRUE      split_2
10      A 2017-03-01 09:16:44   1.2580556        TRUE      split_2
11      A 2017-03-01 10:48:12   1.5244444        TRUE      split_2
> 
library(data.table)
setDT(df)[, grp := rleid(over_thresh|shift(over_thresh, type = 'lead')), vessel]
df[, split_factor := 'delete']
i1 <- df[, .I[any(over_thresh)], .(vessel, grp)]$V1
df[i1, split_factor := paste0('split_', .GRP), .(vessel, grp)][, grp := NULL][]
#     vessel                time         gap over_thresh split_factor
# 1:      A 2017-01-01 00:02:25   0.0000000        TRUE      split_1
# 2:      A 2017-01-01 01:31:26   1.4836111        TRUE      split_1
# 3:      A 2017-01-01 02:37:42   1.1044444        TRUE      split_1
# 4:      A 2017-01-01 03:14:34   0.6144444        TRUE      split_1
# 5:      A 2017-01-01 04:09:45   0.9197222        TRUE      split_1
# 6:      A 2017-02-01 05:51:53 745.7022222       FALSE       delete
# 7:      A 2017-03-01 06:22:24 672.5086111       FALSE      split_2
# 8:      A 2017-03-01 07:34:44   1.2055556        TRUE      split_2
# 9:      A 2017-03-01 08:01:15   0.4419444        TRUE      split_2
#10:      A 2017-03-01 09:16:44   1.2580556        TRUE      split_2
#11:      A 2017-03-01 10:48:12   1.5244444        TRUE      split_2
library(dplyr)
library(stringr)
df %>% 
     group_by(vessel) %>% 
     mutate(split_factor = inverse.rle(within.list(rle(over_thresh|
            lead(over_thresh)),
          values[values] <- str_c('split_', seq_along(values[values])))), 
          split_factor = replace(split_factor, 
             !as.logical(split_factor), 'delete'))
# A tibble: 11 x 5
# Groups:   vessel [1]
#   vessel time                    gap over_thresh split_factor
#   <chr>  <dttm>                <dbl> <lgl>       <chr>       
# 1 A      2017-01-01 00:02:25   0     TRUE        split_1     
# 2 A      2017-01-01 01:31:26   1.48  TRUE        split_1     
# 3 A      2017-01-01 02:37:42   1.10  TRUE        split_1     
# 4 A      2017-01-01 03:14:34   0.614 TRUE        split_1     
# 5 A      2017-01-01 04:09:45   0.920 TRUE        split_1     
# 6 A      2017-02-01 05:51:53 746.    FALSE       delete      
# 7 A      2017-03-01 06:22:24 673.    FALSE       split_2     
# 8 A      2017-03-01 07:34:44   1.21  TRUE        split_2     
# 9 A      2017-03-01 08:01:15   0.442 TRUE        split_2     
#10 A      2017-03-01 09:16:44   1.26  TRUE        split_2     
#11 A      2017-03-01 10:48:12   1.52  TRUE        split_2