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