![](/img/trans.png)
[英]Efficiently update multiple data.table columns based on a single condition
[英]data.table: Update multiple columns in a data.table with a matrix
如何使用矩陣中的值更新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
您需要將RHS轉換為list
,一種簡單的方法是使用as.data.table
:
DT[, 2:ncol(DT) := as.data.table(mat[,2:ncol(DT)])]
with
此沒有必要,因為LHS被推斷為自動意味着列數。
分配給多個列時,應該在列表中收集列:
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])]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.