자전거의 궤적을 다른 스테이션으로 추적하는 샘플 데이터 세트가 있습니다. 자전거이 경우, difftime()
와 특정 역에 남아 내 목표는 간격을 찾을 수 있습니다, 역선행 행의 데이터 참조
> 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.,이 경우 무시해야합니다. 위의 데이터 세트에서 01:30:00
과 07:30:00
사이에 360 분이 경과했으며 120 분이 16:00:00
과 18:00:00
사이에서 경과했으며 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()
을 사용 하시겠습니까? 자전거는 대기 상태에서 주문을 위해 다시 전체에 ...
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 % 확신 (''prev_endstation = shift (end_station)''prev_endtime = shift (endtime))''대신''test '',': =''대신에 현재의 두뇌 상태로는 발견 할 수 없다. 죄송합니다. PLZ 설명을 보내십시오. ;) – Henrik
@Henrik 나는 장황한 설명을 편집했고 몇 가지 설명이 필요하다는 데 동의한다. 그것이 그것이 모두에게 설득력이 있는지 확실하지 않지만 그것이 의미가 있기를 바란다. 감사 :) – Frank