R data.table-带有';的新列:=';并保留现有列

R data.table-带有';的新列:=';并保留现有列,r,data.table,R,Data.table,是否可以创建一个新列并在语句中保留(少数)现有列?e、 g.创建“x”列,然后保留“x”和“mpg”列 dt如果我们在单个步骤中需要它,而不是执行:=修改原始数据集,请在列表中使用=或指定它( 或者,如果需要在原始数据集中创建列,则可以对其进行管道传输 dt[, x := mpg][, .(x, mpg)] 如果要更新原始对象中的列,另一个选项是set set(dt[, x:= mpg], i = NULL, j = names(dt)[!names(dt) %in% c('x', 'mp

是否可以创建一个新列并在语句中保留(少数)现有列?e、 g.创建“x”列,然后保留“x”和“mpg”列


dt如果我们在单个步骤中需要它,而不是执行
:=
修改原始数据集,请在
列表中使用
=
指定它(


或者,如果需要在原始数据集中创建列,则可以对其进行管道传输

dt[, x := mpg][, .(x, mpg)]

如果要更新原始对象中的列,另一个选项是
set

set(dt[, x:= mpg], i = NULL, j = names(dt)[!names(dt) %in% c('x', 'mpg')], value = NULL)

如果要通过引用进行替换,请使用
:=
,然后可以执行以下操作

dt[, x:=mpg][, setdiff(colnames(dt), c('x', 'mpg')) := NULL]

从性能角度看,哪个选项更有效?我假设选项#1需要将输出分配回原始数据表。对吗?dt@R007
:=
更快,但是您也在进行子集设置。您可以用
微基准检查更大的数据集吗?您需要修改原始对象吗我完全同意。更新原始对象是不可取的。我有一种情况,在处理时间上的微小节省会增加价值。
set(dt[, x:= mpg], i = NULL, j = names(dt)[!names(dt) %in% c('x', 'mpg')], value = NULL)
dt[, x:=mpg][, setdiff(colnames(dt), c('x', 'mpg')) := NULL]