我有一個樣本數據集,用於跟蹤不同車站的自行車軌跡。我的目標是找到間隔的自行車保持在與difftime()
特定站,在這種情況下,站B.引用前導行中的數據
> 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
有時,自行車不要在他們結束了同一個站開始,這些案件應該被忽略。在上述數據集中,我們可以看到在01:30:00
和07:30:00
之間經過360分鐘,在16:00:00
和18:00:00
之間經過120分鐘,並且在18:30:00
和19:00:00
之間經過了30分鐘。第8行和第10行被忽略,因爲自行車不是在它結束的同一個車站開始的。因此,輸出矢量應爲:
[1] 360 120 30
下面的代碼使用的是不產生所需的輸出:
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"])
一個如何將考慮到下一行並計算difftime()
只有當end_station
和start_station
在下面一行是否相等?在dplyr
中使用lead()
?任何建議,將不勝感激
這裏是樣本數據:
> 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")
我敢肯定,100%你有一個很好的理由使用'melt'&'dcast'打造 「idleDT」 ,而不是類似'test [,'':=''(prev_endstation = shift(end_station),prev_endtime = shift(endtime))]'',但不幸的是,我目前的大腦狀態不允許我發現它。抱歉。 Plz發送解釋。 ;) – Henrik
@Henrik我編輯了一個冗長的解釋,我同意需要一些解釋。希望它是有道理的,但我不確定它是否會讓每個人都信服。謝謝 :) – Frank