我有一个表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
答案 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