簡體   English   中英

R data.table從另一個data.table替換值的索引

[英]R data.table replacing an index of values from another data.table

嗨,仍然試圖找出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替換為date_idid匹配的那些我對此有點date_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的值,可以使用前綴i. 來自有關版本1.7.10新聞

前綴i。 現在可以在j中用來引用i的連接繼承列,否則這些列將被x中具有相同名稱的列掩蓋。

b[a, `:=`(px = i.px, vol = i.vol)]

聽起來你不需要你的描述中的roll ,當你收到錯誤時,你似乎想要這樣做:

t[!is.na(px),`:=`(px.1=px,vol.1=vol),by=list(date_id,id)]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM