J'ai un jeu de données d'échantillons qui suit la trajectoire d'un vélo vers différentes stations. Mon objectif est de trouver les intervalles que le vélo reste à une station particulière avec difftime()
, dans ce cas, la station B.Référencement des données dans les rangées principales
> test
bikeid start_station starttime end_station endtime
1 1 A 2017-09-25 01:00:00 B 2017-09-25 01:30:00
2 1 B 2017-09-25 07:30:00 C 2017-09-25 08:00:00
3 1 C 2017-09-25 10:00:00 A 2017-09-25 10:30:00
4 1 A 2017-09-25 13:00:00 C 2017-09-25 13:30:00
5 1 C 2017-09-25 15:30:00 B 2017-09-25 16:00:00
6 1 B 2017-09-25 18:00:00 B 2017-09-25 18:30:00
7 1 B 2017-09-25 19:00:00 A 2017-09-25 19:30:00
8 1 А 2017-09-25 20:00:00 B 2017-09-25 20:30:00
9 1 C 2017-09-25 22:00:00 C 2017-09-25 22:30:00
10 1 B 2017-09-25 23:00:00 C 2017-09-25 23:30:00
Parfois, les vélos ne commencent pas à la même station qu'ils ont fini, et ces cas devrait être ignoré. Dans l'ensemble de données ci-dessus, nous pouvons voir que 360 minutes se sont écoulées entre 01:30:00
et 07:30:00
, que 120 minutes se sont écoulées entre 16:00:00
et 18:00:00
, et que 30 minutes se sont écoulées entre 18:30:00
et 19:00:00
. Les rangs 8 et 10 sont ignorés car la moto ne démarre pas à la même station que celle où elle s'est terminée. Par conséquent, le vecteur de sortie doit être:
[1] 360 120 30
Le code suivant à l'aide ne produit pas la sortie désirée:
sapply(test$starttime[test$end_station == "B"], function(x, et) difftime(et[x < et][1], x, units = "mins"), et = test$endtime[test$start_station == "B"])
Comment peut-on prendre en compte la ligne suivante et calculer difftime()
que lorsque le end_station
et start_station
dans la rangée suivante sont égaux? En utilisant lead()
dans dplyr
? Toute suggestion serait appréciée
Voici les données de l'échantillon:
> dput(test)
structure(list(bikeid = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1), start_station = c("A",
"B", "C", "A", "C", "B", "B", "А", "C", "B"), starttime = structure(c(1506315600,
1506339000, 1506348000, 1506358800, 1506367800, 1506376800, 1506380400,
1506384000, 1506391200, 1506394800), class = c("POSIXct", "POSIXt"
), tzone = ""), end_station = c("B", "C", "A", "C", "B", "B",
"A", "B", "C", "C"), endtime = structure(c(1506317400, 1506340800,
1506349800, 1506360600, 1506369600, 1506378600, 1506382200, 1506385800,
1506393000, 1506396600), class = c("POSIXct", "POSIXt"), tzone = "")), .Names = c("bikeid",
"start_station", "starttime", "end_station", "endtime"), row.names = c(NA,
-10L), class = "data.frame")
Je suis 100% sûr que vous avez une bonne raison d'utiliser '' melt' & dcast' pour créer "idleDT" , au lieu de quelque chose comme 'test [,' ': =' '(prev_endstation = shift (end_station), prev_endtime = shift (endtime))]', mais malheureusement mon état actuel du cerveau ne me permet pas de le repérer. Pardon. Plz envoyer l'explication. ;) – Henrik
@Henrik J'ai édité dans une longue explication et je suis d'accord qu'une explication était nécessaire. J'espère que cela a du sens, même si je ne suis pas sûr que ce sera convaincant pour tout le monde. Merci :) – Frank