如何使用数据执行semi-join.桌子半联接与内部联接类似,只是它只返回X的列(不返回Y的列),并且不重复X的行以匹配Y的行.例如,以下代码执行内部联接:
x <- data.table(x = 1:2, y = c("a", "b"))
setkey(x, x)
y <- data.table(x = c(1, 1), z = 10:11)
x[y]
# x y z
# 1: 1 a 10
# 2: 1 a 11
半联接只返回x[1]
如何使用数据执行semi-join.桌子半联接与内部联接类似,只是它只返回X的列(不返回Y的列),并且不重复X的行以匹配Y的行.例如,以下代码执行内部联接:
x <- data.table(x = 1:2, y = c("a", "b"))
setkey(x, x)
y <- data.table(x = c(1, 1), z = 10:11)
x[y]
# x y z
# 1: 1 a 10
# 2: 1 a 11
半联接只返回x[1]
更多可能性:
w = unique(x[y,which=TRUE]) # the row numbers in x which have a match from y
x[w]
如果x中存在重复的键值,则需要:
w = unique(x[y,which=TRUE,allow.cartesian=TRUE])
x[w]
或者,反过来说:
setkey(y,x)
w = !is.na(y[x,which=TRUE,mult="first"])
x[w]
If nrow(x) << nrow(y) then the y[x] approach should be faster.
If nrow(x) >> nrow(y) then the x[y] approach should be faster.
但反对加入的呼声也一样:-)