【发布时间】:2018-10-27 12:12:32
【问题描述】:
在这里参考我之前的问题: Flag rows with interval overlap in r
我有一个包含一些位置信息的数据框(1 = 位置 A,4 = 位置 B) :
df <- data.frame(stringsAsFactors=FALSE,
date = c("2018-09-02", "2018-09-02", "2018-09-02", "2018-09-02",
"2018-09-02", "2018-09-02", "2018-09-02", "2018-09-02",
"2018-09-02"),
ID = c("18101276-aa", "18101276-aa", "18102843-aa", "18102843-aa", "18102843-ab",
"18102843-aa", "18104148-aa", "18104148-ab", "18104148-ab"),
location = c(1L, 1L, 1L, 4L, 4L, 1L, 1L, 1L, 4L),
Start = c(111300L, 143400L, 030000L, 034900L, 064400L, 070500L, 060400L,
075100L, 081600L),
End = c(111459L, 143759L, 033059L, 035359L, 064759L, 070559L, 060459L,
81559L, 83559L),
start_hour_minute = c(1113L, 1434L, 0300L, 0349L, 0644L, 0705L, 0604L, 0751L, 0816L),
end_hour_minute = c(1114L, 1437L, 0330L, 0353L, 0647L, 0705L, 0604L, 0815L, 0835L))
在这里,我们有一些观察结果(第 8 行和第 9 行),个人在一分钟内在两个位置之间跳跃(这是不可能的!)。我想知道,如何在我的时间间隔内标记这些奇怪的位置变化?
我按照建议使用lubridate::interval() 来制作间隔类对象:
data_out <- df %>%
# Get the hour, minute, and second values as standalone numerics.
mutate(
date = ymd(date),
Start_Hour = floor(Start / 10000),
Start_Minute = floor((Start - Start_Hour*10000) / 100),
Start_Second = (Start - Start_Hour*10000) - Start_Minute*100,
End_Hour = floor(End / 10000),
End_Minute = floor((End - End_Hour*10000) / 100),
End_Second = (End - End_Hour*10000) - End_Minute*100,
# Use the hour, minute, second values to create a start-end timestamp.
Start_TS = ymd_hms(date + hours(Start_Hour) + minutes(Start_Minute) + seconds(Start_Second)),
End_TS = ymd_hms(date + hours(End_Hour) + minutes(End_Minute) + seconds(End_Second)),
# Create an interval object.
Watch_Interval = interval(start = Start_TS, end = End_TS))
【问题讨论】:
-
我认为您不需要所有中间时间变量,也不需要间隔。只需立即创建一个适当的日期时间变量,例如
as.POSIXct(paste(date, sprintf("%06d", Start)), format = "%Y-%m-%d %H%M%S"),然后像例如这里计算时差:Calculate time difference (difftime) between columns of different rows。检查时间差异是否 > 1 分钟。结合检查滞后的“位置”(以类似方式创建)是否与当前位置不同。
标签: r intervals tidyverse lubridate