等值连接

# example data
a = data.table(id = c(1L, 1L, 2L, 3L, NA_integer_), x = 11:15)
#    id  x
# 1:  1 11
# 2:  1 12
# 3:  2 13
# 4:  3 14
# 5: NA 15

b = data.table(id = 1:2, y = -(1:2))
#    id  y
# 1:  1 -1
# 2:  2 -2

直觉

x[i] 视为为 i 的每一行选择 x 的子集。该语法镜像基 R 中的矩阵子集,并且与 DT[where, select|update|do, by]的第一个参数意义 where 一致

有人可能想知道为什么这个新语法值得学习,因为 merge(x,i) 仍然适用于 data.tables。简短的回答是,我们通常希望合并,然后再做一些事情。x[i] 语法简明扼要地捕获了这种使用模式,并且还允许更有效的计算。有关更详细的说明,请阅读常见问题解答 1.122.14

处理多重匹配的行

默认情况下,a 的每一行都匹配 b 的每一行:

a[b, on="id"]
#    id  x  y
# 1:  1 11 -1
# 2:  1 12 -1
# 3:  2 13 -2

这可以用 mult 调整:

a[b, on="id", mult="first"]
#    id  x  y
# 1:  1 11 -1
# 2:  2 13 -2

处理不匹配的行

默认情况下,a 的不匹配行仍显示在结果中:

b[a, on="id"]
#    id  y  x
# 1:  1 -1 11
# 2:  1 -1 12
# 3:  2 -2 13
# 4:  3 NA 14
# 5: NA NA 15

要隐藏这些,请使用 nomatch

b[a, on="id", nomatch=0]
#    id  y  x
# 1:  1 -1 11
# 2:  1 -1 12
# 3:  2 -2 13

请注意,x[i] 将尝试匹配 i 中的 NA。

计数匹配返回

要计算 i 每行的匹配数,请使用 .Nby=.EACHI

b[a, on="id", .N, by=.EACHI]
#    id N
# 1:  1 1
# 2:  1 1
# 3:  2 1
# 4:  3 0
# 5: NA 0