У меня есть некоторые данные отслеживания, где я хочу, чтобы вычислить разницу во времени между каждой точкой, которую я могу сделать с этим:Как перекомпилировать список, разделенный по уровню фактора, на исходный фрейм данных?
# prep the data
ID = c(rep("A",5), rep("B",5))
DateTime = c("2014-09-25 08:39:45", "2014-09-25 08:39:48", "2014-09-25 08:40:44", "2014-09-25 09:04:00","2014-09-25 09:04:10", "2014-09-25 08:33:32", "2014-09-25 08:34:41", "2014-09-25 08:35:24", "2014-09-25 09:04:00", "2014-09-25 09:04:09")
speed = c(1:10)
df = data.frame(ID,DateTime,speed, stringsAsFactors = FALSE)
df$DateTime<-as.POSIXct(df$DateTime, tz = "UTC")
# function to calculate time differences
timeCheck<-function(df) {
sapply(1:(nrow(df) - 1), function(i){
timeDiff<- difftime(df$DateTime[i+1], df$DateTime[i], units = "sec")
return(timeDiff)
})
}
# preserve order of factor levels
df$ID <- factor(df$ID, levels=unique(df$ID))
# apply the function by ID
timeDiffData<-sapply(split(df, df$ID), timeCheck)
Я хочу, чтобы иметь возможность добавить новый столбец временных разниц в первоначальной dataframe но, конечно, этот список имеет разную длину, потому что функция не вычисляет разницу во времени от себя.
Затем я хочу использовать эти временные разницы в новой функции для разделения треков, если разница больше определенного значения (например, 100 секунд для примера), и идентификатор отражает это.
Так что в конце концов у меня было бы 4 уровня для моего идентификационного столбца, и разнесение произойдет, когда разница во времени> 100 секунд.
В результате dataframe должен выглядеть примерно так:
# what it should look like
ID = c(rep("A",3),rep("A1",2) , rep("B",3), rep("B1",2))
DateTime = c("2014-09-25 08:39:45", "2014-09-25 08:39:48", "2014-09-25 08:40:44", "2014-09-25 09:04:00","2014-09-25 09:04:10", "2014-09-25 08:33:32", "2014-09-25 08:34:41", "2014-09-25 08:35:24", "2014-09-25 09:04:00", "2014-09-25 09:04:09")
speed = c(1:10)
timeDiff<-c(NA,3,56,1396,10,NA,69,43,1716,9)
newdf = data.frame(ID,DateTime,speed,timeDiff, stringsAsFactors = FALSE)
newdf$DateTime<-as.POSIXct(df$DateTime, tz = "UTC")
newdf