Selecting a subset of columns in a data.table

data.table, r

Solution

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).

Problem

I'd like to print all the columns of a data table `dt` except one of them named `V3` but don't want to refer to it by number but by name. This is the code that I have: ``` dt = data.table(matrix(sample(c(0,1),5,rep=T),50,10)) dt[,-3,with=FALSE] # Is this the only way to not print column "V3"? ``` Using the `data frame` way, one could do this through the code: ``` df = data.frame(matrix(sample(c(0,1),5,rep=T),50,10)) df[,!(colnames(df)%in% c("X3"))] ``` So, my question is: is there another way to not print one column in a data table without the necessity of refer to it by number? I'd like to find something similar to the data frame syntax I used above but using data table.

Original source

Related problems