r - 使用 .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 ]
谢谢。
解决方案
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.table
j
推荐阅读
- sql-server - 如何从sql中的特定日期获取一个季度的日期列表?
- c++ - 区分 C++ 中基指针向量中的派生对象
- java - Sonarqube 规则:在一行中识别多个方法调用
- spring-boot - 为什么spring boot devtools两次调用main方法?
- openlayers - 在 Openlayers 2 中更改功能悬停光标
- angular5 - Angular 5 如何动态添加 ngx-perfect-scrollbar?
- c# - NServiceBus 错误是否意味着消息未按正确顺序处理?
- jbutton - 如何刷新jlabel?
- excel - 根据 Excel 中列中的值添加新行
- javafx - 现在如何在 JavaFX 10 中从 TableView 获取 TableHeaderRow?