Removing multiple columns from R data.table with parameter for columns to remove
data.table, r
Solution
It's basically because we allow symbols on LHS of `:=` to add new columns, for convenience: ex: `DT[, col := val]`. So, in order to distinguish `col` itself being the name from whatever is stored in `col` being the column names, we check if the LHS is a `name` or an `expression`.
If it's a `name`, it adds the column with the name as such on the LHS, and if `expression`, then it gets evaluated.
DT[, col := val] # col is the column name.
DT[, (col) := val] # col gets evaluated and replaced with its value
DT[, c(col) := val] # same as above
The preferred idiom is: `dt[, (colsToDelete) := NULL]`
HTH
Problem
I'm trying to manipulate a number of data.tables in similar ways, and would like to write a function to accomplish this. I would like to pass in a parameter containing a list of columns that would have the operations performed. This works fine when the vector declaration of columns is the left hand side of the := operator, but not if it is declared earlier (or passed into the function). The follow code shows the issue. ``` dt = data.table(a = letters, b = 1:2, c=1:13) colsToDelete = c('b', 'c') dt[,colsToDelete := NULL] # doesn't work but I don't understand why not. dt[,c('b', 'c') := NULL] # works fine, but doesn't allow passing in of columns ``` The error is "Adding new column 'colsToDelete' then assigning NULL (deleting it)." So clearly, it's interpreting 'colsToDelete' as a new column name. The same issue occurs when doing something along these lines ``` dt[, colNames := lapply(.SD, adjustValue, y=factor), .SDcols = colNames] ``` I new to R, but rather more experienced with some other languages, so this may be a silly question.