I want to apply interpolation functions from one data.table to each row of another data.table. interp.dt <- data.table(scen = rep(c("a", "b"), c(3, 3)), term = c(1, 20, 60, 1, 32, 72), shock = c(10, 20, 30, 9, 12, 32)) interp.fn <- function(df, x) with(df, approx(term, shock, xout = x)$y) mydt <- data.table(name = c("xx", "yy", "zz"), term = c(22, 6, 18)) ## Does not work ## scen.dt <- CJ(scen = c("a", "b"), mydt) scen.dt <- lapply(c("a", "b"), function(scenario) {tempdt <- copy(mydt); tempdt[, scen := scenario]}) scen.dt <- rbindlist(scen.dt) ## Works interp.fn(interp.dt[scen == "a"], 22) ## Does not work ## scen.dt[, shock := interp.fn(interp.dt[scen == scen], term)] ## Works using data.frame apply scen.dt[, "shock"] <- apply(scen.dt, 1, function(row) { interp.fn(interp.dt[scen == row["scen"]], as.numeric(row["term"]))}) Is it possible to get both the above results using native data.table methods? Thanks, Naresh