gpt4 book ai didi

前导行中的引用数据

转载 作者:行者123 更新时间:2023-12-01 10:27:16 25 4
gpt4 key购买 nike

我有一个示例数据集,用于跟踪自行车到不同站点的轨迹。我的目标是使用 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:0007:30:00 之间过去了 360 分钟,16:00 之间过去了 120 分钟:0018:00:00,以及 18:30:0019: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"])

只有当下一行的 end_stationstart_station 相等时,如何考虑下一行并计算 difftime() ?在 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")

最佳答案

reshape as suggested上次...

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)

然后在自行车闲置时回到宽阔的咒语......

idleDT = dcast(mtest[-c(1,.N)][, g := rep(1:.N, each=2, length.out=.N)], 
g ~ rowid(g), value.var=c("station", "time"))

g station_1 station_2 time_1 time_2
1: 1 B B 2017-09-25 01:30:00 2017-09-25 07:30:00
2: 2 C C 2017-09-25 08:00:00 2017-09-25 10:00:00
3: 3 A A 2017-09-25 10:30:00 2017-09-25 13:00:00
4: 4 C C 2017-09-25 13:30:00 2017-09-25 15:30:00
5: 5 B B 2017-09-25 16:00:00 2017-09-25 18:00:00
6: 6 B B 2017-09-25 18:30:00 2017-09-25 19:00:00
7: 7 A <U+0410> 2017-09-25 19:30:00 2017-09-25 20:00:00
8: 8 B C 2017-09-25 20:30:00 2017-09-25 22:00:00
9: 9 C B 2017-09-25 22:30:00 2017-09-25 23:00:00

然后加入或过滤并计算...

idleDT[.("B", "B"), on=.(station_1, station_2), time_2 - time_1 ]

Time differences in mins
[1] 360 120 30

评论

我可能应该解释为什么我更喜欢长格式 mtest 而不是 OP 的 test,即使我直接回到宽格式进行分析(感谢@Henrik) ...

  • 站点可能/应该是一个因素,如果您将其拆分为核心数据中的两列,则要确保这两个因素具有相同的水平是一种负担。
  • 数据大概是根据事件(例如“自行车离开”和“自行车到达”)记录的,而不是根据行程记录的。例如,如果有人偷了自行车或它丢失了,那么 endtimeend_station 逻辑上应该丢失,但这更容易以长格式跟踪,在我的意见。
  • 测量数据甚至可能连续出现两个“自行车到达”事件,尽管这在逻辑上没有意义,但根据我的经验,任何数据可能出错的地方都会出错。如果发生这种情况,您将很难弄清楚如何以宽格式记录行程。

一般来说,我只是应用我对 tidy data 的理解(可能过于热心或错误) ,重复 Hadley 在有关数据布局的链接中的提示,其中“[c] 列标题是值,而不是变量名。”

关于前导行中的引用数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46438681/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com