通过引用合并和分配,`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.table
和 this 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
我正在尝试通过合并在 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.table
和 this SO 问题链接在其中:
When
i
is adata.table
,DT[i,j,by=.EACHI]
evaluatesj
for the groups inDT
that each row ini
joins to. That is, you can join (ini
) and aggregate (inj
) simultaneously. We call this grouping by eachi
.
还有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