等值连接
# 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.12 和 2.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
每行的匹配数,请使用 .N
和 by=.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