首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >data.table:用矩阵更新data.table中的多列

data.table:用矩阵更新data.table中的多列
EN

Stack Overflow用户
提问于 2015-08-12 18:41:00
回答 2查看 2.1K关注 0票数 4

如何用矩阵的值更新data.table中的多个列。这是一个MWE,说明了我所面临的问题:

代码语言:javascript
复制
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世界中,我将使用以下语法:

代码语言:javascript
复制
DF[,2:ncol(DF)] = mat[,2:ncol(DF)] #Data frame approach

对于data.table语法的类似处理会产生多个警告,输出结果非常奇怪。

代码语言:javascript
复制
DT[,2:ncol(DF) := mat[,2:ncol(DF)], with=FALSE] #Data table approach

这显然是错误的-因为警告表明矩阵实际上是扁平的。警告信息:

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-08-12 18:47:55

您需要将RHS转换为list,一个简单的方法是使用as.data.table

代码语言:javascript
复制
DT[, 2:ncol(DT) := as.data.table(mat[,2:ncol(DT)])]

这里不需要with,因为LHS是自动推导为平均列数的。

票数 9
EN

Stack Overflow用户

发布于 2015-08-12 19:05:16

当分配给多个列时,应在列表中收集这些列:

代码语言:javascript
复制
idx <- 2:ncol(DT)
DT[,idx] <- lapply(idx, function(col) mat[,col])

同样的语法也适用于data.frame。它在data.table中是不标准的( set:=是惯用的),但我认为通过引用修改DT仍然有好处。

惯用的:=方法是:

代码语言:javascript
复制
DT[,(idx) := lapply(idx, function(col) mat[,col])]
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31972989

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档