作者joson4921 (特务)
看板R_Language
标题[问题] 列与列计算时间差,结果与预期不同
时间Sun Jan 1 07:21:35 2017
文章分类提示:
- 问题: 当你想要问问题时,请使用这个类别。
[问题类型]:
程式谘询(我想用R 做某件事情,但是我不知道要怎麽用R 写出来)
[软体熟悉度]:
入门(写过其他程式,只是对语法不熟悉)
[问题叙述]:
请简略描述你所要做的事情,或是这个程式的目的
如标题,我想做的是列与列的时间计算(以本例来说就是找不同车次发车时间间隔)
手边有一份端点站的发车时间表如下所示
表定6:00~8:00「每隔10~20分不等」(去/返程)对开出一班车
我想要的结果是根据每个车次的发车时间找出一个range,用来判断实际发车时间应属哪一
车次
先假设这个range的预期结果是前後车次发车时间的中间值(5/5分配,之後可能会用2/8分)
:
(去/返程) (表定发车时间) (车次编号) (预期结果↓)
Goback Schedule_DepartTime Bus_No. rid1 qid1 start1 end1 difference
0 06:00 1 1 0 06:00 08:00 -
0 06:20 2 2 1 06:20 06:00 20min
0 06:35 3 3 2 06:35 06:20 15min
0 06:50 4 4 3 06:50 06:35 15min
0 07:00 5 5 4 07:00 06:50 10min
0 07:10 6 6 5 07:10 07:00 10min
0 07:25 7 7 6 07:25 07:10 15min
0 07:40 8 8 7 07:40 07:25 15min
0 08:00 9 9 8 08:00 07:40 20min
1 06:00 1 10 0 ---
1 06:20 2 11 1 ---
1 06:35 3 12 2 ---
1 06:50 4 13 3 --- 因两端点发车时间相同故
1 07:00 5 14 4 --- Goback=1时之预期结果应
1 07:10 6 15 5 --- 与Goback=0之预期结果相
同
1 07:25 7 16 6 ---
1 07:40 8 17 7 ---
1 08:00 9 18 8 ---
###先新增column "rid1" 和 "qid1",时间相减时要用
式1 BusScedule_51[, Schedule_DepartTime :=
as.POSIXct(strptime(strptime( Schedule_DepartTime, "%H:%M"))] %>%
式2 Schedule_DepartTime, "%H:%M"))] %>%
.[ , c("rid1","qid1") := list( .I, {.I - .I[1L]}), by = .(Goback)]
###用上面2式新增的 "rid1" 和 "qid1" column跑以下式子,
###但出来的答案跟预期的答案不一样
式3 BusScedule_51[ , start1 := Schedule_DepartTime[Bus_No.] ]
式4 BusScedule_51[ , end1 := Schedule_DepartTime[-qid1] ]
式5 BusScedule_51[ , difference := start1 - end1 ]
问题:
我知道式4里面写 [-qid1] 会抓让过来的时间资料通通下移,
我想利用这个特性来作时间加减,但 qid1=0 的情况要怎麽处理difference我还没想到..
总之是拿之前写的code改,但是出来的结果却变成下面那样:
(请注意"---"右边end1那一排):
(去/返程) (表定发车时间) (车次编号) (预期结果↓)
Goback Schedule_DepartTime Bus_No. rid1 qid1 start1 end1 difference
0 06:00 1 1 0 06:00 08:00 -
0 06:20 2 2 1 06:20 06:00 20min
0 06:35 3 3 2 06:35 06:20 15min
0 06:50 4 4 3 06:50 06:35 15min
0 07:00 5 5 4 07:00 06:50 10min
0 07:10 6 6 5 07:10 07:00 10min
0 07:25 7 7 6 07:25 07:10 15min
0 07:40 8 8 7 07:40 07:25 15min
0 08:00 9 9 8 08:00 07:40 20min
1 06:00 1 10 0 --- 08:00
1 06:20 2 11 1 --- 08:00
1 06:35 3 12 2 --- 06:00
1 06:50 4 13 3 --- 06:20
1 07:00 5 14 4 --- 06:35
1 07:10 6 15 5 --- 06:50
1 07:25 7 16 6 --- 07:00
1 07:40 8 17 7 --- 07:10
1 08:00 9 18 8 --- 07:20
如上所示,「资料出现在不该出现的位置」,搞了快2天还是搞不懂到底是哪里写错了
请求板上大大们伸出援手...先谢谢大家orz
[程式范例]:
[环境叙述]:
请提供 sessionInfo() 的输出结果,
里面含有所有你使用的作业系统、R 的版本和套件版本资讯,
让版友更容易找出错误
[关键字]:
选择性,也许未来有用
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 140.113.136.219
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/R_Language/M.1483226505.A.DDD.html
※ 编辑: joson4921 (140.113.136.219), 01/01/2017 07:23:41
1F:→ cywhale: 如果只算时间差 diff:=start-shift(start),by=.(Goback)01/01 08:21
好的,待会来试试@@
※ 编辑: joson4921 (114.136.66.35), 01/01/2017 08:24:56
2F:→ celestialgod: 建议拆成两张表做,两张表都用同一个函数处理 01/01 14:04
3F:→ celestialgod: 之後再合并 01/01 14:04
4F:→ celestialgod: 然後strptime跟as.POSIXct的performance很差 01/01 14:04
5F:→ celestialgod: 我也会建议在前处理就做好,中间不要再转换 01/01 14:05
6F:→ celestialgod: 如果拆成两张做,我觉得你的问题就可以解决了 01/01 14:05
7F:→ celestialgod: 用split(data.table, by = "GoBack) 01/01 14:05
8F:→ celestialgod: 然後配上 lapply(split_list, function(dt) ...) 01/01 14:06
9F:→ celestialgod: 最後再 rbindlist变回同一张表 01/01 14:06
10F:→ joson4921: c大可能是我用的方法不对,我查了一堆lapply的用法但都 01/02 17:57
11F:→ joson4921: 没讲到要怎麽做时间相减..转回dataframe的方法还在看.. 01/02 17:58
12F:→ celestialgod: 我不是说用lapply做时间相减,我意思是你这里 01/02 20:23
13F:→ celestialgod: 拆成list个别处理可以比较简单 01/02 20:23
14F:→ celestialgod: 时间相减,我之前不是demo过了吗? 01/02 20:24
15F:→ celestialgod: 我还是建议就给一个虚拟日期 然後相减就好啦 01/02 20:24
17F:→ joson4921: 喔喔!!是我误会了..orz 这就来弄,感谢!! 01/02 20:38
18F:→ joson4921: 死了...能不能请c大推荐用list处理资料的文...我之前都 01/02 21:16
19F:→ joson4921: 是处理dataframe, list好像不给用 := 处理... 01/02 21:17
20F:→ joson4921: split完之後就卡了,R不给我用 := 後面根本没办法写.. 01/02 21:30
21F:→ celestialgod: 把置底的翻转教室玩过一遍吧 01/03 00:11
22F:→ joson4921: 好的,谢谢c大 01/03 00:25