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