Filter data.table by multiple columns, dynamically

data.table, r

Solution

One option is to construct the string you want and `eval/parse` it:

EVAL = function(...)eval(parse(text=paste0(...)))   # standard helper function

a[ EVAL(my.cols, ">median(", my.cols, ")", collapse=" & ") ]

Problem

Suppose I have a `data.table` with a few columns: ``` a <- data.table(id=1:1000, x=runif(100), y=runif(100), z=runif(100)) ``` I want to drop the rows where `x`, `y` or `z` is below the median: ``` a <- a[ x > median(x) & y > median(y) & z > median(z) ] ``` (aside: does the above call `median` 3 times or 3000 times?) What I do is ``` my.cols <- c("x","y","z") my.meds <- sapply(my.cols, function(n) median(a[[n]])) a <- a[ Reduce(`&`,Map(function(i) a[[my.cols[i]]] > my.meds[i], 1:length(my.cols))) ] ``` Is this the best I could do?

Original source