0

我想在 data.table 中创建一个变量,因为语法更具可读性,然后将其存储在矩阵中以便更快地访问。

我想出了一种笨拙的方法(参见dt_to_mat下面的函数),并希望有更好的选择(不携带另一个包的包袱或奇怪的属性)。通过“更好”,我的意思是易于维护和扩展,以便从几个 data.table 的“边距”列(两个用于矩阵)和一个“值”列中创建一个数组。

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重塑命令。即使不剥离其属性,它也通过了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 回答