我有两个数据表:
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我考虑过切换j
和x
数据集以及i
中的条件。虽然这会产生所需的连接值,但它仍然需要后处理(删除,重命名和重新排序列)。
答案 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