使用`j`选择`x`的连接列及其所有非连接列

时间:2017-02-19 15:37:02

标签: r data.table

我有两个数据表:

library(data.table)
d1 <- data.table(grp = c("a", "c", "b", "a"), val = c(2, 3, 6, 7), y1 = 1:4, y2 = 5:8)

d2 <- data.table(grp = rep(c("a", "b", "c"), 2),
                 from = rep(c(1, 5), each = 3), to = rep(c(4, 10), each = 3), z = 11:16)

我执行非equi连接,其中'd1'中的'val'值应该落在每个组'grp'的'from'和'd''d''定义的范围内。

d1[d2, on = .(grp, val >= from, val <= to), nomatch = 0]
#    grp val y1 y2 val.1  z
# 1:   a   1  1  5     4 11
# 2:   c   1  2  6     4 13
# 3:   a   5  4  8    10 14
# 4:   b   5  3  7    10 15

在输出中,连接变量来自i('val'和'val.1','d'的值分别为'from'和'to')。但是,我想改为使用x的连接列。现在,因为......

  

x的列现在可以使用前缀x.引用,在加入引用x的连接列时特别有用,因为它们被{{1 }}的

...这可以通过在i中指定val = x.val来实现:

j

为了避免在d1[d2, .(grp, val = x.val, z), on = .(grp, val >= from, val <= to), nomatch = 0] 中从x键入所有非连接列(可能很多),我目前的解决方法是将上面的内容与原始数据相结合,从而得到所需的结果:

j

然而,这看起来有点笨拙。因此,我的问题是:我如何一次性从d1[d1[d2, .(grp, val = x.val, z), on = .(grp, val >= from, val <= to), nomatch = 0] , on = .(grp, val)] # grp val y1 y2 z # 1: a 2 1 5 11 # 2: c 3 2 6 13 # 3: a 7 4 8 14 # 4: b 6 3 7 15 x x中的所有非加入列中选择加入列?

PS我考虑过切换jx数据集以及i中的条件。虽然这会产生所需的连接值,但它仍然需要后处理(删除,重命名和重新排序列)。

2 个答案:

答案 0 :(得分:3)

  

PS我考虑过切换x和i数据集,以及开启的条件。虽然这会产生所需的连接值,但它仍然需要进行后处理(删除,重命名和重新排序列)。

后期处理的数量受到有多少on=列的限制:

d2[d1, on=.(grp, from <= val, to >= val), nomatch=0][, 
  `:=`(val = from, from = NULL, to = NULL)][]

这看起来并不太糟糕。

按照@ Jaap的评论,这是另一种方法,使用更新加入向d1添加列:

nm2 = setdiff(names(d2), c("from","to","grp"))
d1[d2, on=.(grp, val >= from, val <= to), (nm2) := mget(sprintf("i.%s", nm2))]

这在这里是有道理的,因为期望的输出基本上是d1加上d2的一些列(因为d1的每一行最多匹配d2的一行)。

答案 1 :(得分:1)

也许使用$json = json_decode($json,true);//converts into array echo $json['success'];

中的foverlaps
data.table