Re: [问题] 不同资料集字段比对,再输出比对结果

楼主: celestialgod (天)   2016-12-25 18:34:37
※ 引述《joson4921 (特务)》之铭言:
:
: - 问题: 当你想要问问题时,请使用这个类别。
:
: [问题类型]:
:
: 程式咨询(我想用R 做某件事情,但是我不知道要怎么用R 写出来)
:
: [软件熟悉度]:
:
: 入门(写过其他程式,只是对语法不熟悉)
:
: [问题叙述]:
:
: 手边有两个资料集,分别是 data1 (预计发车时间), data2 (实际发车时间)
: 我想做的事情是根据起站发车班表 data1 ,写个判断式进行时间比对
: 先上两个资料集的格式与内容示意
: data1 data2 预期结果
: Bus_No. DepartureTime DepartureTime Bus_No.
: 1 5:50 2015-12-25 06:51:20 4
: 2 6:10 2015-12-26 06:53:30 4
: 3 6:30 2015-12-27 06:29:58 3
: 4 6:50 2015-12-28 05:52:32 1
: 5 7:10 2015-12-29 07:09:24 5
: 判断式的判断条件:
: data1是预计发车时间,data2是实际发车时间,
: 比对方式:找实际发车时间与预计发车时间差距最小者(发车前后5分钟都认定为该Bus_No.)
: Bus_No.的判定结果目前是打算用dpylr加在data2的Departure字段后面,
: 最后结果输出为data3(内含 DepartureTime 和 Bus_No. 两个字段)
: 碰到的问题:
: 1.卡在不同资料集的字段资料比对
: 2.data1的Departure字段 和 data2的Departure字段 时间格式不一样,不知怎么写判断式
两个格式都转成POSIXct就好,data1的年月日可以随便给一个,下面给1990/01/01
在mapping条件的时候,再把data2的年月日align data1的就好了
: 以上问题还要再麻烦各位大大解惑了@@
:
: [程式范例]:
:
: data3 <- data2[.(这边应该是写时间判断的东西,但我想不出怎么写), ] %>%
: .[.(DepartureTime, Bus_No.)]
:
: [环境叙述]:
:
: 请提供 sessionInfo() 的输出结果,
: 里面含有所有你使用的作业系统、R 的版本和套件版本资讯,
: 让版友更容易找出错误
:
: [关键字]:
:
: dplyr
:
写得很丑,不过用data.table的foverlap或是non-equi joins应该会是比较简单的做法
dplyr作法就等别人补充吧~~~
好读版:http://pastebin.com/4jZLUSLF
library(data.table)
# data generation
numBus <- 20L
departTimeSpan <- "20 mins"
data1 <- data.table(busNo = 1L:numBus,
departTime = seq.POSIXt(as.POSIXct("1990-01-01 05:50:00"),
by = departTimeSpan, length.out = numBus))
## data1
# busNo departTime
# 1: 1 1990-01-01 05:50:00
# 2: 2 1990-01-01 06:10:00
# 3: 3 1990-01-01 06:30:00
# 4: 4 1990-01-01 06:50:00
# 5: 5 1990-01-01 07:10:00
# 6: 6 1990-01-01 07:30:00
# 7: 7 1990-01-01 07:50:00
# 8: 8 1990-01-01 08:10:00
# 9: 9 1990-01-01 08:30:00
# 10: 10 1990-01-01 08:50:00
# 11: 11 1990-01-01 09:10:00
# 12: 12 1990-01-01 09:30:00
# 13: 13 1990-01-01 09:50:00
# 14: 14 1990-01-01 10:10:00
# 15: 15 1990-01-01 10:30:00
# 16: 16 1990-01-01 10:50:00
# 17: 17 1990-01-01 11:10:00
# 18: 18 1990-01-01 11:30:00
# 19: 19 1990-01-01 11:50:00
# 20: 20 1990-01-01 12:10:00
# 产生2015/10/01~2015/12/31中前后五分钟的班次
dataCnt <- 5L
data2 <- data.table(departTime = sample(data1$departTime, dataCnt, TRUE) +
as.difftime(sample(9404:9495, dataCnt, TRUE), units = "days") +
as.difftime(sample(-300:300, dataCnt, TRUE), units = "secs"))
# departTime
# 1: 2015-11-25 08:49:53
# 2: 2015-10-27 09:47:25
# 3: 2015-11-02 10:27:39
# 4: 2015-10-18 08:11:40
# 5: 2015-12-02 09:11:13
## method 1
# find the departure time range
diffTime5mins <- as.difftime(5, units = "mins")
data1[ , start := departTime - diffTime5mins]
data1[ , end := departTime + diffTime5mins]
setkey(data1, start, end)
# align time to 1990/01/01
data2[ , start := departTime - floor(departTime -
as.POSIXct("1990-01-01 00:00:00"))]
data2[ , end := start]
# use foverlaps to find the busNo
foverlaps(data2, data1)[ , .(i.departTime, busNo)]
# i.departTime busNo
# 1: 2015-11-25 08:49:53 10
# 2: 2015-10-27 09:47:25 13
# 3: 2015-11-02 10:27:39 15
# 4: 2015-10-18 08:11:40 8
# 5: 2015-12-02 09:11:13 11
## method 2
# find the departure time range
diffTime5mins <- as.difftime(5, units = "mins")
data1[ , start := departTime - diffTime5mins]
data1[ , end := departTime + diffTime5mins]
setkey(data1, start, end)
# align time to 1990/01/01
data2[ , departTimeAlign := departTime - floor(departTime -
as.POSIXct("1990-01-01 00:00:00"))]
# use Non-equi joins
data2[data1, on = .(departTimeAlign >= start, departTimeAlign <= end),
nomatch = 0][ , .(departTime, busNo)]
# departTime busNo
# 1: 2015-10-18 08:11:40 8
# 2: 2015-11-25 08:49:53 10
# 3: 2015-12-02 09:11:13 11
# 4: 2015-10-27 09:47:25 13
# 5: 2015-11-02 10:27:39 15
还有任何问题再推文吧~~~

Links booklink

Contact Us: admin [ a t ] ucptt.com