3

假设我有以下两个数据表:

dt1 <- data.table(id=1:3,val1=c("a","a","b"),key="id")
#    id val1
# 1:  1    a
# 2:  2    a
# 3:  3    b


dt2 <- data.table(id=c(1:3,1:2),val2=10:14,key="id")
#    id val2
# 1:  1   10
# 2:  1   13
# 3:  2   11
# 4:  2   14
# 5:  3   12

假设这dt1是一个由他们识别的人的列表id,以及dt2对这些人的观察列表,与通讯员id

现在,我想计算val2每组val1. 我知道我可以通过以下方式做到这一点:

dt1[dt2][,mean(val2),by=val1]
#    val1 V1
# 1:    a 12
# 2:    b 12

但我也在常见问题解答(第 1.14 节)中读到它效率不高(至少对于非常大的数据表)。

那么,有没有更好、更有效的方法呢?

编辑:另一个相关问题:我刚刚看到以下两行将给出相同的结果:

dt1[dt2][,mean(val2),by=val1]
dt2[dt1][,mean(val2),by=val1]

它们是等效的还是两者之间有区别?

4

1 回答 1

5

在你的情况下,这样做是可以的。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]为每个idindt2获取并获取所有其他列的相应值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中的每个 来执行连接:dt1dt2

dt2[dt1]
#    id val2 val1
# 1:  1    6    a
# 2:  4   NA    a
# 3:  5   NA    b

请注意,中的值dt1[dt2]包含的 id 。同样仅包含. 在您的情况下,由于s 完全相同(忽略它们发生的次数),因此两个连接都会为您提供相同的连接(列的顺序除外),iiuc。dt2dt2[dt1]dt1id


只是为了使这部分完整,如果您想要“完整”连接,请使用mergewith 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]
于 2013-04-05T09:43:31.620 回答