【问题标题】:Unable to perform rolling join on time and another variable in data.table无法按时执行滚动连接和 data.table 中的另一个变量
【发布时间】: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=InfNAs 的列产生相同的结果。

如果bike_ids 在两个表中相同并且time 永远不是NAroll='nearest' 不会找到至少某个日期吗?

【问题讨论】:

  • 您可以在帖子中添加dput(head(df1))dput(head(df2))

标签: r dplyr data.table


【解决方案1】:

这似乎解决了问题

test = df2[df1, on=.(bike_id, time = time), roll="nearest", 
            .(bike_id, time, st_x, st_y)]

【讨论】:

    猜你喜欢
    • 2016-04-18
    • 2020-03-01
    • 2016-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-15
    • 2022-01-07
    相关资源
    最近更新 更多