この質問への回答を要約し、
a)否定に適したもの(否定によって列を選択できるようにするため)、
b)パイプラインに適したもの(%>%演算子を使用してパイプラインで使用できるようにするため) )、および
c)列番号と列名の両方を使用して選択できるように、これらは使用可能なオプションです。
library(data.table);
select1 <- function (dt, range) dt[, range, with=F]
select2 <- function (dt, range) dt[, ..range]
select3 <- function (dt, range) dt[, .SD, .SDcols=range]
dt <- ggplot2::diamonds
range <- 1:3 # or
range <- dt %>% names %>% .[1:3]
dt %>% select1(range);
dt %>% select2(range);
dt %>% select3(range);
dt %>% select1(-range);
dt %>% select2(-range);
dt %>% select3(-range); # DOES NOT WORK
Also we note that this
dt %>% .[, ..(names(dt)[1:3])] # DOES NOT WORK
したがって、で複数の列を選択するための最良の(最も普遍的で高速な)方法data.table
は次のとおりです。
# columns are selected using column numbers:
range <- 1:3
dt %>% select1(range);
dt %>% .[, range, with=F]
# The same works if columns are selected using column names:
range <- names(dt) [1:3]
dt %>% select1(range);
dt %>% .[, range, with=F]
PS。複数の列を選択する代わりに、参照によってdata.tableから複数の列を効率的に削除する場合(つまり、data.table全体をコピーする代わりに)、data.tableの:=
演算子を使用できます。しかし、1行の複数の列に対してそれを行う方法がわかりません