我正在尝试通过合并在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
的{{1}}定义为TRUE
,pd
最高 - rnk
值var
超过2.上面的代码对我来说似乎很自然,但这会导致错误:object 'i.chk' not found
(建议合并尚未完成,因为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个这样的列,这大大减慢了我的代码。
合并时是否无法按组引用更新?
答案 0 :(得分:3)
您可以使用.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与之相关的问题:
当
i
为data.table
时,DT[i,j,by=.EACHI]
会对j
中DT
中的每一行加入的i
组进行评估i
。也就是说,您可以同时加入(j
)并聚合(在i
中)。我们将每个data.table
称为分组。
同样使用devel版本的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
。
var enemyHealth = enemy.lostHealth + '/' + enemy.initialHealth