【发布时间】:2015-10-12 03:03:42
【问题描述】:
背景
(问题不需要,但可能对阅读有用)
Rolling join on data.table with duplicate keys
Odd behaviour when joining with multiple conditions
数据
library(data.table) ## using version 1.9.6
## arrival timetable
dt_arrive <- structure(list(txn_id = c(1L, 1L, 1L, 1L, 1L), place = c("place_a",
"place_a", "place_a", "place_a", "place_a"), arrival_minutes = c(515,
534, 547, 561, 581), journey_id = 1:5), .Names = c("txn_id",
"place", "arrival_minutes", "journey_id"), class = c("data.table",
"data.frame"), row.names = c(NA, -5L), sorted = c("txn_id",
"place"))
## departure timetable
dt_depart <- structure(list(txn_id = c(1L, 1L, 1L, 1L), place = c("place_a",
"place_a", "place_a", "place_a"), arrival_minutes = c(489, 507,
519, 543), journey_id = 10:13), .Names = c("txn_id", "place",
"arrival_minutes", "journey_id"), sorted = c("txn_id", "place"
), class = c("data.table", "data.frame"), row.names = c(NA, -4L
))
> dt_arrive
txn_id place arrival_minutes journey_id
1: 1 place_a 515 1
2: 1 place_a 534 2
3: 1 place_a 547 3
4: 1 place_a 561 4
5: 1 place_a 581 5
> dt_depart
txn_id place arrival_minutes journey_id
1: 1 place_a 489 10
2: 1 place_a 507 11
3: 1 place_a 519 12
4: 1 place_a 543 13
问题
我想以arrival_minutes 的形式加入仅那些发生在之后 dt_arrive$journey_id 的dt_depart$journey_id 的到达和离开(即内部连接)在txn_id & place)
例如,我想要的输出是:
txn_id place journey_in_id journey_out_id journey_place_arrive journey_place_depart
1 place_a 1 12 515 519
1 place_a 1 13 515 543
1 place_a 2 13 534 543
尝试
使用我构建的两个链接问题中的方法
setkey(dt_arrive, txn_id, place)
setkey(dt_depart, txn_id, place)
dt_join <- dt_arrive[dt_depart,
{
idx = (i.arrival_minutes > arrival_minutes)
.(journey_in_id = journey_id[idx],
journey_out_id = i.journey_id,
journey_place_arrive = arrival_minutes[idx],
journey_place_depart = i.arrival_minutes
)
},
by=.EACHI]
但这给出了来自dt_depart 的所有内容,因此在结果中包含NAs - 这表明“正确连接”:
txn_id place journey_in_id journey_out_id journey_place_arrive journey_place_depart
1: 1 place_a NA 10 NA 489
2: 1 place_a NA 11 NA 507
3: 1 place_a 1 12 515 519
4: 1 place_a 1 13 515 543
5: 1 place_a 2 13 534 543
我尝试使用nomatch=0 强制它“内部连接”,但这没有奏效。
我可以使用complete.cases 删除NA 行,但我想知道是否有办法在查询本身中执行此操作?
【问题讨论】:
-
为什么您的“例如”输出排除了 534 到 543 行?
-
@Frank 错字-应该包括在内。
-
@Frank 你删除了你的答案吗?我认为它包括了所需的三行?
-
是的,抱歉,我认为这是错误的(例如,在与您的示例不同的情况下会给出错误的结果),但再看一遍,我改变了主意并取消了删除。
-
我们正在研究数据表的非 equi 连接扩展。完成后将更新此帖子。
标签: r data.table