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

时间:2015-07-26 22:22:09

标签: r data.table

我正在尝试通过合并在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}}定义为TRUEpd最高 - rnkvar超过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个这样的列,这大大减慢了我的代码。

合并时是否无法按组引用更新?

1 个答案:

答案 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.tablethis与之相关的问题:

  

idata.table时,DT[i,j,by=.EACHI]会对jDT中的每一行加入的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