【发布时间】:2018-01-16 00:26:05
【问题描述】:
我有两个 data.tables - 一个带有位置快照 (df2),另一个带有游乐设施结束的时间 (df1)。我的目标是在df1 上加入非常大的df2,其中时间最接近且bike_ids 匹配。我已经在data.table 中尝试了所有方法,但似乎没有任何效果。
我几乎一字不差地关注this example 以通过bike_id 和最近的time 合并,但我最终得到了空列。
sum(is.na(df1$time))
# [1] 0
sum(is.na(df2$time))
# [1] 0
sapply(df1, class)
# $time
# [1] "POSIXct" "POSIXt"
# $bike_id
# [1] "integer"
sapply(df2, class)
# $time
# [1] "POSIXct" "POSIXt"
# $bike_id
# [1] "integer"
# $st_x
# [1] "numeric"
# $st_y
# [1] "numeric"
all(df1$bike_id %in% df2$bike_id)
# [1] TRUE
这两个表都没有时间值NA,并且都包含相同的bike_ids。
例如:
head(df1)
# time bike_id
# 1: 2017-12-20 07:29:22 16465
# 2: 2017-12-20 15:34:36 16465
# 3: 2017-12-09 22:08:56 16468
# 4: 2017-12-10 12:38:53 16468
# 5: 2017-12-18 00:19:18 16468
# 6: 2017-12-18 17:29:18 16468
head(df2)
# time bike_id st_x st_y
# 1: 2017-12-04 16:21:31 16465 -90.07687 29.95264
# 2: 2017-12-04 16:30:05 16465 -90.07687 29.95264
# 3: 2017-12-04 16:40:05 16465 -90.07687 29.95264
# 4: 2017-12-04 16:50:05 16465 -90.07687 29.95264
# 5: 2017-12-04 17:00:06 16465 -90.07687 29.95264
# 6: 2017-12-04 17:10:06 16465 -90.07687 29.95264
我用来匹配bike_id 和最近的time 的代码是:
setkey(df2, time, bike_id)[, dateMatch:=time]
test <- df2[df1, roll = 'nearest']
head(test)
# time bike_id st_x st_y dateMatch
# 1: 2017-12-20 07:29:22 16465 NA NA <NA>
# 2: 2017-12-20 15:34:36 16465 NA NA <NA>
# 3: 2017-12-09 22:08:56 16468 NA NA <NA>
# 4: 2017-12-10 12:38:53 16468 NA NA <NA>
# 5: 2017-12-18 00:19:18 16468 NA NA <NA>
# 6: 2017-12-18 17:29:18 16468 NA NA <NA>
关于可能出现什么问题的任何想法?替换 roll=Inf 与 NAs 的列产生相同的结果。
如果bike_ids 在两个表中相同并且time 永远不是NA,roll='nearest' 不会找到至少某个日期吗?
【问题讨论】:
-
您可以在帖子中添加
dput(head(df1))和dput(head(df2))
标签: r dplyr data.table