你好,仍在努力理解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'))
我尝试的是用a中的px和vol替换b中的px和vol,其中
date_id
和id
匹配。我有些困惑 - 我认为可能需要类似于以下内容的方式,但我不认为这在实践中会起作用。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.
b <- b[a,roll=T]
。如果您不想要原始的NA
列,可以在此之后直接删除它们,尽管可能有更好的一步解决方法。 - Simon O'Hanlon