在你的情况下,这样做是可以的。iiuc 文档解释的内容例如在这种情况下(您没有对所有列进行分组/聚合):
dt1 <- data.table(id=1:3,val1=c("a","a","b"),key="id")
dt2 <- data.table(id=c(1:3,1:2),val2=10:14,key="id")
dt2[, val3 := rep(5:7, c(2,1,2))]
# id val2 val3
# 1: 1 10 5
# 2: 1 13 5
# 3: 2 11 6
# 4: 2 14 7
# 5: 3 12 7
现在,假设您想val2
为每个 获得单独的平均值val1
,那么连接所有列是没有意义的。在这种情况下,您可以这样做:
dt1[dt2, list(val1, val2)][, mean(val2), by=val1]
# val1 V1
# 1: a 12
# 2: b 12
而不是这样做:
# gives same result but performs join on all columns
dt1[dt2][, mean(val2), by=val1]
对于您的第二个问题,我想了解差异dt1[dt2]
和dt2[dt1]
. 为此,您的数据并不是最好的例子。假设,
dt1 <- data.table(id=c(1,4,5), val1=c("a","a","b"))
dt2 <- data.table(id=c(1,2,3,6,7,8), val2=c(6,5,3,4,2,1))
setkey(dt1, "id")
setkey(dt2, "id")
dt1[dt2]
为每个id
indt2
获取并获取所有其他列的相应值dt1
以执行连接:
dt1[dt2]
# id val1 val2
# 1: 1 a 6
# 2: 2 NA 5
# 3: 3 NA 3
# 4: 6 NA 4
# 5: 7 NA 2
# 6: 8 NA 1
dt2[dt1]
从其他列中获取对应值id
中的每个 来执行连接:dt1
dt2
dt2[dt1]
# id val2 val1
# 1: 1 6 a
# 2: 4 NA a
# 3: 5 NA b
请注意,中的值仅dt1[dt2]
包含的 id 。同样仅包含. 在您的情况下,由于s 完全相同(忽略它们发生的次数),因此两个连接都会为您提供相同的连接(列的顺序除外),iiuc。dt2
dt2[dt1]
dt1
id
只是为了使这部分完整,如果您想要“完整”连接,请使用merge
with all=TRUE
。该merge.data.table
方法已实现。
merge(dt1, dt2, all = TRUE)
merge(dt1, dt2, all.x = TRUE)
# is equivalent to
dt2[dt1]
merge(dt1, dt2, all.y = TRUE)
# is equivalent to
dt1[dt2]