如何用矩阵的值更新data.table中的多个列。这是一个MWE,说明了我所面临的问题:
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这显然是错误的-因为警告表明矩阵实际上是扁平的。警告信息:
1: In `[.data.table`(DT, , `:=`(2:ncol(DF), mat[, 2:ncol(DF)]), with = FALSE) :
2 column matrix RHS of := will be treated as one vector发布于 2015-08-12 18:47:55
您需要将RHS转换为list,一个简单的方法是使用as.data.table。
DT[, 2:ncol(DT) := as.data.table(mat[,2:ncol(DT)])]这里不需要with,因为LHS是自动推导为平均列数的。
发布于 2015-08-12 19:05:16
当分配给多个列时,应在列表中收集这些列:
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])]https://stackoverflow.com/questions/31972989
复制相似问题