我想在 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()
测试,但需要构造公式。