Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Selecting a subset of columns in a data.table

Tags:

r

data.table

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.

like image 640
nhern121 Avatar asked Aug 13 '12 19:08

nhern121


People also ask

Which function do you use for selecting columns?

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.


1 Answers

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

like image 140
Andrie Avatar answered Oct 03 '22 09:10

Andrie