首页 > 解决方案 > 使用 .SD 对 data.table 中的多个变量应用函数时分配新变量

问题描述

我了解如何使用 .SD 对多个列执行操作;我只是不知道如何将这些新值分配给我的数据表中的新变量(不覆盖输入变量)

在这个例子中,我创建了三个以字符串“newvars”结尾的新变量。我将这些新变量合并回数据表。是否可以在没有合并的情况下创建新的变量?

mtcars <- data.table( mtcars )  
newvars <- mtcars[ , lapply( .SD , function( Z ) Z * mtcars[[  "wt" ]]) , .SDcols= c("hp","drat","gear")]   
colnames(   newvars ) <- paste( colnames( newvars) , "newvars", sep="_")
mtcars <- cbind( mtcars , newvars )

似乎应该有一种直接的方式来做到这一点。

如果我没有那么多专栏,我会一一做

mtcars[ ,   hp_new := hp*wt ]

谢谢。

标签: rdata.table

解决方案


IIUC,您正在添加新列。惯用的方法是使用:=如下,将列名的新字符向量放在括号():=

library(data.table)
mtc <- data.table(mtcars)
cols <- c("hp", "drat", "gear")
mtc[, (paste0(cols, "_newvars")) := lapply(.SD, `*`, wt), .SDcols=cols]
mtc

此外,您不需要使用within访问wt列(请参阅的定义)[[j?data.tablej


推荐阅读