总结这个问题的答案,并使其
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 的:=
运算符。但我不知道如何对一行中的多个列执行此操作