Я хочу создать новые столбцы, используя оператор присваивания в data.table, поскольку существующие столбцы делятся на определенное количество. Код, который я пытаюсь, выдает двоичную ошибку оператора из-за характера выражения.Выполнение арифметики с присвоением именованного вектора в data.table
Вот что я пытаюсь сделать:
DT <- data.table(x1=1:4,x2=5:8,x3=9:12)
DT[, c("y1","y2") := mget(c("x1","x2"))] # works as expected
DT[, c("y3","y4") := mget(c("x1","x2"))/2] # Error in mget(c("x1", "x2"))/2 : non-numeric argument to binary operator
Имена столбцов передаются через переменные, следовательно, вектор символов. Есть ли альтернативный способ сделать это?
спасибо за подробное объяснение! Я не думал об этом прокручивать, поскольку я не понял источник ошибки. Первый метод, использующий 'mget', работал для меня. Со вторым подходом вы могли бы изменить свой ответ, чтобы сделать его «eval (c (« x1 »,« x2 »)', если он идиоматичен? Я упростил имена переменных в моем вопросе, они фактически не в последовательности. – Naumz
@Naumz Нет 'eval' не возвращает значение столбцов. Вам нужно либо' mget', либо 'get' (для одного столбца). Если он не находится в последовательности, вы все равно можете использовать '.SDcols = c (" x1 "," x2 ")' или '.SDcols = c (1, 2)' ie индекс столбца – akrun
Я бы не рекомендовал его, но 'DT [, setDT (mget (paste0 («x», 1: 2)))/2] 'также, по-видимому, работает. Или' DT [, .SD/2, .SDcols = x1: x2] ' – Frank