通过引用合并和分配,`by` ID

Merge and assign by reference, `by` ID

我正在尝试通过合并在 data.table 中定义一个新变量。问题是我想访问 .N 以便按组定义新变量,所以我也想使用 by,但这会导致错误。

MRE:

dt1<-data.table(pd=rep(1:2,each=3),rnk=rep(1:3,2),
                var=c(3:1,1:3),key="pd")
dt2<-data.table(pd=c(1,2),chk=c(2,2),key="pd")

dt1[dt2,new:=var[.N]>i.chk,by=pd]

如您所见,我想将 new 定义为 TRUE 每当 [=pd 内)最高 rnk 值时19=] 超过 2。上面的代码对我来说似乎很自然,但这会导致错误:object 'i.chk' not found(表明合并尚未完成,因为名称 space of dt2似乎不可用)。

我可以通过第二步解决这个问题:

> dt1[dt2,new:=var>i.chk][,new:=new[.N],by=pd][]
   pd rnk var   new
1:  1   1   3 FALSE
2:  1   2   2 FALSE
3:  1   3   1 FALSE
4:  2   1   1  TRUE
5:  2   2   2  TRUE
6:  2   3   3  TRUE

但是,这大大降低了我的代码速度,因为我使用 `:=` 来更新大约 6 个这样的列。

有没有办法在合并的时候按组引用更新?

您可以使用 .EACHI

library(data.table)#v1.9.5+ 
dt1[dt2, new:=var[.N]>i.chk,.EACHI][]
#   pd rnk var   new
#1:  1   1   3 FALSE
#2:  1   2   2 FALSE
#3:  1   3   1 FALSE
#4:  2   1   1  TRUE
#5:  2   2   2  TRUE
#6:  2   3   3  TRUE

请参阅 ?data.tablethis SO 问题链接在其中:

When i is a data.table, DT[i,j,by=.EACHI] evaluates j for the groups in DT that each row in i joins to. That is, you can join (in i) and aggregate (in j) simultaneously. We call this grouping by each i.

还有data.table的devel版本,可能不需要设置key,但是可以使用on

 dt1[dt2, new:=var[.N] > i.chk ,on='pd', by =.EACHI][]
 #  pd rnk var   new
 #1:  1   1   3 FALSE
 #2:  1   2   2 FALSE
 #3:  1   3   1 FALSE
 #4:  2   1   1  TRUE
 #5:  2   2   2  TRUE
 #6:  2   3   3  TRUE