data.table聚合在一个密钥子集上并与该子集连接

时间:2014-07-10 02:49:24

标签: r aggregate data.table

我有一个表Y,它包含来自更大表X的唯一键的子集,其中包含许多重复键。对于Y中的每个键,我想在X中聚合相同的键并将聚合变量添加到Y.我一直在使用data.table并且我已经提出了一种无需工作的方法制作副本,但我希望有一个更快,更少语法的令人眼花缭乱的解决方案。随着更多变量的添加,语法变得越来越难以阅读,当我真正关心表Y时,会对表X进行更多辅助引用。

我的问题,只是为了澄清,是否有更有效和/或语法更简单的方法来执行此操作。

我的解决方案:

Y[X[Y, b:= sum(a)], b := i.b, nomatch=0]

例如:

set.seed(1)
X = data.table(id = sample.int(10,30, replace=TRUE), a = runif(30))
Y = data.table(id = seq(1,5))

setkey(X,id)
setkey(Y,id)

#head(X)

   #id         a
#1:  1 0.4112744
#2:  1 0.3162717
#3:  2 0.6470602
#4:  2 0.2447973
#5:  3 0.4820801
#6:  3 0.8273733

Y[X[Y, b := sum(a)], b := i.b, nomatch=0]

#head(Y)

#   id         b
#1:  1 0.7275461
#2:  2 0.8918575
#3:  3 3.0622883
#4:  4 2.9098465
#5:  5 0.7893562

2 个答案:

答案 0 :(得分:2)

IIUC,我们可以在这里使用data.table的by-without-by功能......

## <= 1.9.2
X[Y, list(b=sum(a))]            ## implicit by-without-by

## 1.9.3
X[Y, list(b=sum(a)), by=.EACHI] ## explicit by
#    id         b
# 1:  1 0.7275461
# 2:  2 0.8918575
# 3:  3 3.0622883
# 4:  4 2.9098465
# 5:  5 0.7893562

在1.9.3中,by-without-by现已更改为要求显式 by`。您可以在1.9.3新功能点(1)和(2)下阅读更多相关信息here,以及其中的链接。

答案 1 :(得分:1)

这是你的想法吗?

# set up a reproducible example
library(data.table)
set.seed(1)    # for reproducible example
X = data.table(id = sample.int(10,30, replace=TRUE), a = runif(30))
Y = data.table(id = seq(1,5))
setkey(X,id)
setkey(Y,id)

# this statement does the work
result <- X[,list(b=sum(a)),keyby=id][Y]
result
# id         b
# 1:  1 0.7275461
# 2:  2 0.8918575
# 3:  3 3.0622883
# 4:  4 2.9098465
# 5:  5 0.7893562

这可能会更快,因为它首先对X进行子集。

result.2 <- X[Y][,list(b=sum(a)),by=id]
identical(result, result.2)
# [1] TRUE