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.
To pick out single or multiple columns use the select() function. The select() function expects a dataframe as it's first input ('argument', in R language), followed by the names of the columns you want to extract with a comma between each name.
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).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With