私は、異なるステーションに自転車の軌道を追跡するサンプルデータセットを持っています。私の目標は、時々、自転車は、彼らが終了し、同じ駅で開始し、これらの例はありません先頭行のデータを参照する
> 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
B.
駅、自転車はこの場合には、difftime()
と特定の駅で残っているの間隔を見つけること です無視する必要があります。上記のデータセットでは、
01:30:00
と
07:30:00
の間で360分が経過し、120分が
16:00:00
と
18:00:00
の間で経過し、30分が
18:30:00
と
19:00:00
の間に経過したことがわかります。自転車が終了した同じ駅で始動しないため、行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"])
どのようにしてアカウントに次の行を取るときにのみend_station
difftime()
を計算するであろうと次の行のstart_station
は等しいか? dplyr
にlead()
を使用していますか?任意の提案はここ
をいただければ幸いサンプルデータです:
自転車がアイドル状態のときでも、呪文のために戻ってワイドに続いて...library(data.table)
mtest = melt(setDT(test), id="bikeid",
meas = patterns("_station", "time"),
variable.name = "event",
value.name = c("station", "time"))
mtest[.(factor(1:2), c("start", "end")), on=.(event), event := i.V2]
setkey(mtest, bikeid, time)
をas suggested最後の時間をリシェイプ
> 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")
私はあなたが "idleDT" を作成するために 'melt'&' dcast'を使用するための十分な理由を持っている100%確信しています残念ながら私の現在の脳の状態は私にそれを見つけさせません。ごめんなさい。 Plzは説明を送る。 ;) – Henrik
@Henrik私は長年の説明で編集しました。私はいくつかの説明が必要であることに同意します。私はそれが誰にも納得できるかどうかはわかりませんが、それは意味をなさないことを望みます。ありがとう:) – Frank