gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 04:15:39 25 4
gpt4 key购买 nike

我有两个数据表:

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)

我执行了一个非对等连接,其中 'd1' 中的值 'val' 应落在每个组 'grp' 中的 'd2' 中的 'from' 和 'to' 定义的范围内。
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',分别为 'd2' 中的 'from' 和 'to' 值)。但是,我想要 x的连接列代替。现在,因为...

Columns of x can now be referred to using the prefix x. and is particularly useful during joining to refer to x's join columns as they are otherwise masked by i's.



...这可以通过指定 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 的所有非连接列在 j一气呵成?

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

最佳答案

PS I have considered switching the x and i data sets, and the conditions in on. Although that produces the desired join values, it still requires post-processing (deleting, renaming and reordering of columns).



后期处理的数量受限于多少 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 的一行)。

关于r - 使用 `j` 选择 `x` 的连接列及其所有非连接列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42329157/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com