5

您好仍在尝试找出data.table。如果我有一个如下值的 data.table,用另一个 data.table 中的值替换这些值的最有效方法是什么?

set.seed(123456)

a=data.table(
  date_id = rep(seq(as.Date('2013-01-01'),as.Date('2013-04-10'),'days'),5),
  px =rnorm(500,mean=50,sd=5),
  vol=rnorm(500,mean=500000,sd=150000),
  id=rep(letters[1:5],each=100)
  )

b=data.table(
  date_id=rep(seq(as.Date('2013-01-01'),length.out=600,by='days'),5),
  id=rep(letters[1:5],each=600),
  px=NA_real_,
  vol=NA_real_
  )

setkeyv(a,c('date_id','id'))
setkeyv(b,c('date_id','id'))

我想要做的是将 b 中的 px 和 vol 替换为 wheredate_ididmatch 中的那些我对此有点困惑 - 我认为类似的东西可能是要走的路,但我没有t认为这将在实践中起作用。

b[which(b$date_id %in% a$date_id & b$id %in% a$id),list(px:=a$px,vol:=a$vol)]

编辑

我尝试了以下

t = a[b,roll=T]
t[!is.na(px),list(px.1:=px,vol.1=vol),by=list(date_id,id)]

并收到错误消息

Error in `:=`(px.1, px) : 
  := is defined for use in j only, and (currently) only once; i.e., DT[i,col:=1L] and DT[,newcol:=sum(colB),by=colA] are ok, but not DT[i,col]:=1L, not DT[i]$col:=1L and not DT[,{newcol1:=1L;newcol2:=2L}]. Please see help(":="). Check is.data.table(DT) is TRUE.
4

2 回答 2

8

如果要替换其中的值,b可以使用前缀i.。来自关于版本 1.7.10 的新闻

前缀 i。现在可以在 j 中使用来指代连接 i 的继承列,否则这些列会被 x 中具有相同名称的列屏蔽。

b[a, `:=`(px = i.px, vol = i.vol)]
于 2013-05-28T23:21:15.800 回答
2

听起来您不需要roll描述中的,当您收到错误时,您似乎想要这样做:

t[!is.na(px),`:=`(px.1=px,vol.1=vol),by=list(date_id,id)]
于 2013-05-28T17:57:01.367 回答