等值連線

# 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