0

構文が読みやすいので 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

xtabsbase(私がここで使用する) は、 reshape コマンドの中で最もひどいものではないように思えました。is.matrix()属性を取り除かなくてもテストに合格しますが、式を作成する必要があります。

4

1 に答える 1

2

これを試して:

as.matrix(wdt[, setNames(as.list(w), y), by = D][, D := NULL])
#       0   1   2   3   4   5
#[1,] 1.0 2.0 3.0 4.0 5.0 6.0
#[2,] 1.1 2.2 3.3 4.4 5.5 6.6

コメントによると、これにはacastfromを使用する方がおそらく良いでしょうreshape2:

library(reshape2)
acast(wdt, D ~ y)

# or for the multidimensional case
wdt2 <- CJ(D1=1:2,D2=1:2,y=1:3)[,w:=D1/D2*log(y)]
acast(wdt2, D1 ~ D2 ~ y)
于 2013-08-16T18:30:19.527 に答える