構文が読みやすいので data.table に変数を作成したいのですが、アクセスを高速化するためにマトリックスに格納します。
私はこれを行う不器用な方法を思いついたので (以下の関数dt_to_mat
を参照)、より良い代替手段 (別のパッケージや奇妙な属性の荷物を運ばない) があることを望んでいます。「より良い」とは、複数の data.table 'margin' 列 (マトリックスの場合は 2 つ) と単一の 'value' 列から配列を作成するために、保守と拡張が容易であることを意味します。
get_w <- function(D,y){
(1+c_wD*D)*(c_w0+c_w1*y)}
c_w0 = 1; c_w1 = 1; c_wD = .1
Tbar = 10L
wdt <- CJ(D=0:1,y=0:Tbar)[,w:=get_w(D,y)]
# D y w
# 1: 0 0 1.0
# 2: 0 1 2.0
# 3: 0 2 3.0
# 4: 0 3 4.0
# 5: 0 4 5.0
# 6: 0 5 6.0
# 7: 1 0 1.1
# 8: 1 1 2.2
# 9: 1 2 3.3
# 10: 1 3 4.4
# 11: 1 4 5.5
# 12: 1 5 6.6
...そして、それを行列に保存します:
dt_to_mat <- function(DT){
fla <- paste0(c(names(DT),'~','+')[c(3,4,1,5,2)],collapse="")
out <- xtabs(fla,DT)
attr(out,'call') <- NULL
attr(out,'class')<- NULL
out
}
wmat <- dt_to_mat(wdt)
# y
# D 0 1 2 3 4 5
# 0 1.0 2.0 3.0 4.0 5.0 6.0
# 1 1.1 2.2 3.3 4.4 5.5 6.6
xtabs
base
(私がここで使用する) は、 reshape コマンドの中で最もひどいものではないように思えました。is.matrix()
属性を取り除かなくてもテストに合格しますが、式を作成する必要があります。