Selecting a subset of columns in a data.table

Use a very similar syntax as for a data.frame, but add the argument with=FALSE:

dt[, setdiff(colnames(dt),"V9"), with=FALSE]
    V1 V2 V3 V4 V5 V6 V7 V8 V10
 1:  1  1  1  1  1  1  1  1   1
 2:  0  0  0  0  0  0  0  0   0
 3:  1  1  1  1  1  1  1  1   1
 4:  0  0  0  0  0  0  0  0   0
 5:  0  0  0  0  0  0  0  0   0
 6:  1  1  1  1  1  1  1  1   1

The use of with=FALSE is nicely explained in the documentation for the j argument in ?data.table:

j: A single column name, single expresson of column names, list() of expressions of column names, an expression or function call that evaluates to list (including data.frame and data.table which are lists, too), or (when with=FALSE) same as j in [.data.frame.


From v1.10.2 onwards it is also possible to do this as follows:

keep <- setdiff(names(dt), "V9")
dt[, ..keep]

Prefixing a symbol with .. will look up in calling scope (i.e. the Global Environment) and its value taken to be column names or numbers (source).


From version 1.12.0 onwards, it is also possible to select columns using regular expressions on their names:

iris_DT <- as.data.table(iris)

iris_DT[, .SD, .SDcols = patterns(".e.al")]

Maybe it's only in recent versions of data.table (I'm using 1.9.6), but you can do:

dt[, -'V3']

For several columns:

dt[, -c('V3', 'V9')]

Note that the quotes around the variable names are necessary. Also, if your column names are stored in a variable, say cols, you'll need to do dt[, -cols, with=FALSE].


Edit 2019-09-27 with a more modern approach

You can do this with patterns as mentioned above; or, you can do it with ! if there's a vector of names already:

dt[ , !'V3']
# or
drop_cols = 'V3'
dt[ , !..drop_cols]

.. means "look up one level"


Older version using with=FALSE (data.table is moving away from this argument steadily)

Here's a way that uses grep to convert to numeric and allow negative column indexing:

dt[, -grep("^V3$", names(dt)), with=FALSE]

You did say "V3" was to be excluded, right?

Tags:

R

Data.Table