У меня большой набор данных с несколькими основными переменными, которые мне нужны для вычисления множества различных операций. У меня есть вектор этих переменных cols
в таблице данных dt
, и я пытаюсь использовать lapply
для создания новых переменных. У меня возникают проблемы, когда речь идет о создании новых переменных, которые должны использовать несколько существующих переменных в таблице данных, имена которых построены вокруг основных переменных. Вот пример (код просматривается здесь):
dt = data.table( id = c(1,1,2,2,3,3), x = 1:6, y = 7:12, z = 13:18) ## example data
cols = c("x","y","z") ## my list of variables
dt[ , paste0(cols, ".avg") := lapply(.SD, function(x) mean(x, na.rm = T)), by = .(id), .SDcols = cols]
Я хочу продолжить создание новых переменных таким образом, но мне трудно обратиться к новым столбцам, которые я создал в предыдущем lapply
шагов. Я хочу вычислить разницу между столбцами x
и x.avg
, но продолжаю сталкиваться с ошибками. Я испробовал следующие варианты, которые приводят к ошибкам:
dt[ , paste0(cols,".diff") := lapply(.SD, function(x) x-eval(paste0(x,".avg"))), .SDcols = cols]
Error in x-eval(paste0(x,".avg")) :
non-numeric argument to binary operator
Я хочу шаг lapply
, эквивалентный следующему:
dt[ ':=' (x.diff = x-x.avg,
y.diff = y-y.avg,
z.diff = z-z.avg)]
Заранее спасибо!