수백 척의 선박에 대한 선박 추적 시계열 데이터의 큰 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)
트랙의 일부가 아닌 단일 시간 (6 행)을 추가했음을 알 수 있습니다. 데이터는 트랙의 일부가 아닌 이러한 단일 핑으로 가득 차 있습니다. 나는 또한 그러한 사건을 처리하는 방법을 알고 싶습니다. 지금까지 다른 게시물에서 선택한 코드는 다음과 같습니다.
df$gap <- c(0, with(df, time[-1] - time[-nrow(df)]))/60 # results in hours between rows
gap_threshold <- 10 # anything greater that 10 hours difference I treat as a different track
df$over_thresh <- df$gap < gap_threshold
df
이것은 휴식이 어디에 있는지 식별하지만 사용할 수있는 각 휴식에 고유 한 요소를 어떻게 할당 split(df, df$split_factor)
합니까? 이상적으로 최종 df는 다음과 같아야하지만 'split_factor'열을 만드는 방법을 모르겠습니까?
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
>
두 번째 트랙은 7 행에서 시작하지만 이전 행과의 시간 차이로 인해 FALSE로 식별되었습니다. 그러나 다음 트랙의 일부로 레이블을 지정해야합니다.
또한 이것은 모두 공간 데이터 프레임으로 수행되고 있으므로 이것이 수행 될 수 있다고 가정하지만 잘못되었을 수 있습니다. 데이터를 추출하고 공간 데이터 프레임을 다시 만들 수 있습니다. 문제 없습니다. 감사.
여기에 data.table
. rleid
'vessel'로 그룹화 된 'over_thresh' 를 기반으로 그룹화 인덱스를 만든 다음 'delete'문자열이있는 열로 'split_factor'를 만듭니다. 'vessel', 'grp'로 그룹화 된 'over_thresh'에 요소가있는 .I
행 의 색인 ( )을 any
TRUE
가져오고,에서 사용하고 i
, 그룹 색인 ( .GRP
)을 가져오고, 하위 문자열 split
을 붙여 넣어 i
'split_factor' 에 대한 행 요소를 할당합니다.
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
또는 dplyr
and를 사용하여 rle
'vessel'별로 그룹화 한 후 rle
'over_thresh '에서를 사용하거나 ( |
) of 및 lead
을 반환하는 'over_thresh' 의 (즉, 다음 값)을 사용 합니다. 이제 TRUE 인 값을 'split_', 'value'시퀀스로 할당 한 다음 '삭제'할 값을 변경하여 '값'(즉)을 조작 합니다.list
lengths
values
logical
FALSE
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
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다