等值連線
# 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