【发布时间】:2017-06-20 01:19:32
【问题描述】:
这个问题给出了一个示例,说明如何将基本 R merge 语法中的 by.x = 和 by.y = 参数转换为 data.table 语法,以指定不同命名的列作为连接键:
data.table merge by multiple columns
但是,我不知道如何对非 equi 连接执行相同的操作,而且我对输出感到非常困惑。
示例数据:
set.seed(0)
tmp_dt1<- data.table(grp = c(1,2), time = runif(100))
tmp_dt2 <- data.table(grp = c(1,2), time = c(0.1, 0.5))
tmp_dt2 <- tmp_dt2[, time_to := time + 0.2]
tmp_dt2 <- tmp_dt2[, time_from := time] # for clarity, rename time variable
我想通过grp 等值连接这两个表,然后是非等值连接,这样我只保留tmp_dt1 中的time,它位于time_to 和time_from 之间。据我所知,tmp_dt1[tmp_dt2, , on = c("grp", "time>=time", "time<=time_to")] 做了我想做的事:
> tmp_dt1[tmp_dt2, , on = c("grp", "time>=time", "time<=time_to")]
grp time time.1 time_from
1: 1 0.1 0.3 0.1
2: 1 0.1 0.3 0.1
3: 1 0.1 0.3 0.1
4: 1 0.1 0.3 0.1
5: 1 0.1 0.3 0.1
6: 1 0.1 0.3 0.1
7: 1 0.1 0.3 0.1
...
让我困惑的是x.time 不见了,结果列名非常混乱。例如,为什么会有一个名为time.1 的列?我想澄清一下语法,以便tmp_dt1[tmp_dt2, , on = c("grp", "time>=y.time", "time<=y.time_to")] 产生:
grp y.time y.time_to time_from
1: 1 0.1 0.3 0.1
2: 1 0.1 0.3 0.1
3: 1 0.1 0.3 0.1
4: 1 0.1 0.3 0.1
5: 1 0.1 0.3 0.1
6: 1 0.1 0.3 0.1
7: 1 0.1 0.3 0.1
...
除了y 中的所有列之外,还有一些方法还提取列x.time。不幸的是,这失败并出现错误:
> tmp_dt1[tmp_dt2, , on = c("grp", "time>=y.time", "time<=y.time_to")]
Error in `[.data.table`(tmp_dt1, tmp_dt2, , on = c("grp", "time>=y.time", :
Column(s) [y.time,y.time_to] not found in i
尝试以下也不会产生我期望的结果,而是得到:
> tmp_dt1[tmp_dt2, .(grp, time, time_from = i.time, time_to = i.time_to), on = c("grp", "time>=time", "time<=time_to")]
grp time time_from time_to
1: 1 0.1 0.1 0.3
2: 1 0.1 0.1 0.3
3: 1 0.1 0.1 0.3
4: 1 0.1 0.1 0.3
5: 1 0.1 0.1 0.3
6: 1 0.1 0.1 0.3
7: 1 0.1 0.1 0.3
time 列与 tmp_dt1$time 没有相似之处。
【问题讨论】:
-
好的,据我所知,如果在
X[Y]中使用.()或c()提供on条件,则适用以下连接键匹配规则。如果每个元素都包含一个变量,则在两个表中查找该变量。如果在方程的任一侧都提供了变量,则在X表中查找 LHS 变量,在Y表中查找 RHS 变量。变量提取和最终列名对我来说仍然是个谜。 -
最后的列名总是来自 Y。
on=中的每个条目都有一个连接列。 -
您可能想澄清预期的结果。这是一个相当合理的事情:
tmp_dt1[tmp_dt1[tmp_dt2, on = .(grp, time >= time_from, time <= time_to), which=TRUE]]对第一个表进行子集化。我怀疑将下限和上限作为重复值有什么意义。 -
是的,对不起,我的意思是说最后的列值。连接是
x[i](使用实际的参数名称),可以认为是使用i的行来查找x的行。出于这个原因,我们最终会在结果中得到来自i的值。至少我是这么认为的。对我来说,列名是杂耍,而且很容易定制...... -
我了解混淆名称(需要修复的东西)。同时,看看this post是否有帮助..
标签: r data.table