3

次のコードを使用して、次の data.tables px & vol を設定しようとしています。(遅い for ループに戻ります)

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'))

次のアプローチは機能しません。

s = a[1,id]
d = a[1,date_id]
b[id == s & date_id == d, list(names(b)[3:4])] <- a[id == s & date_id ==d, list(names(a)[2:3])]

次のコードで失敗します

Error in `[<-.data.table`(`*tmp*`, id == s & date_id == d, list(names(b)[3:4]),  : 
  j must be atomic vector, see ?is.atomic

私は何を間違っていますか、そしてそれらの値を1つのdata.tableから他の要素ごとに設定するにはどうすればよいですか? 実際のテーブルにはかなりの数の列があるため、それらを手で書き出すことは私にとってオプションではありません。

ありがとう

4

1 に答える 1

9

あなたの例には複数の問題があります。

まず、フォーム内の data.table の列にアクセスする場合は、次dt[ , "col" ]を追加する必要がありますwith=FALSE

b[ , names(b)[3:4], with = FALSE ]

次に、代入演算子 ( ) を使用して data.table に値を代入できるかどうかはわかりません<-。この目的のために、超高速の参照による更新演算子があります。

b[
  id == s & date_id == d,
  names(b)[3:4] := a[id == s & date_id ==d, names(a)[2:3], with = FALSE],
  with = FALSE
]

第 3 に、data.tables をdt[ col == value, ]構文でサブセット化することは可能ですが、処理が遅くなります。特に、サブセット化したい列にすでにキーが設定されている場合は、次の構文を使用する必要があります。

b[
  J(d,s),
  names(b)[3:4] := a[J(d,s), names(a)[2:3], with = FALSE] ,
  with = FALSE
]

第 4 に、これはすべて、2 つのテーブルの単純な結合が必要であるかのように見えます。したがって、最も簡単なのは

a[ b[ , list(date_id, id) ] ]

または、コメントを考慮して、列のみを上書きし、サブセット内を次のように上書きしたいというpxことvolですa

b[a, c("px", "vol") := a[, list(px, vol)], with = FALSE ]
于 2013-05-26T10:27:17.247 に答える