如何使用矩阵中的值更新exec
中的多个列。这是一个说明我面临的问题的MWE:
data.table
在library(data.table)
DT = data.table(expand.grid(1:3,1:3,1:3))
DF = expand.grid(1:3,1:3,1:3)
mat = matrix(seq(0, 80), 27, 3)
世界中,我会使用这种语法:
data.frame
对DF[,2:ncol(DF)] = mat[,2:ncol(DF)] #Data frame approach
语法的类似看法会产生多个警告,但输出非常奇怪。
data.table
这显然是错误的 - 因为警告表明矩阵实际上是扁平的。警告信息:
DT[,2:ncol(DF) := mat[,2:ncol(DF)], with=FALSE] #Data table approach
答案 0 :(得分:8)
您需要将RHS转换为list
,一种简单的方法是使用as.data.table
:
DT[, 2:ncol(DT) := as.data.table(mat[,2:ncol(DT)])]
此处不需要 with
,因为LHS被推断为自动表示列号。
答案 1 :(得分:3)
分配到多个列时,应该在列表中收集列:
idx <- 2:ncol(DT)
DT[,idx] <- lapply(idx, function(col) mat[,col])
这种语法适用于data.frame。它在data.table中是非标准的(其中set
和:=
是惯用的),但我认为仍然可以通过引用修改DT
。
惯用:=
方法是:
DT[,(idx) := lapply(idx, function(col) mat[,col])]