Назначение в data.table с использованием `: =` ведет к противоречивому поведению

Удалите содержимое папки bin вашего сайта (используйте для этого файл-проводник). Перестроить.

0
задан Frank 15 January 2019 в 17:43
поделиться

1 ответ

Функциональный вызов для j в x[i, j, ...] при назначении x:

`:=`(col1_name = col1, col2_name = col2)

# or

c("col1_name", "col2_name") := list(col1, col2)

Второй способ существует для удобства пользователя (поэтому вам не нужно возиться с обратными галочками вокруг :=). Еще одно удобство предлагается, когда есть один столбец:

`:=`(col1_name = col1)

# or 

col1_name := list(col1)

# or 

col1_name := col1

Здесь последний вариант избавляет вас от необходимости заключать в list(...). Такая же удобная функция появляется, когда присутствует by=. В обоих случаях ожидается, что j будет вычислять список столбцов, поэтому пустой вектор также рассматривается как список столбцов длины один. Если вы хотите избежать расплаты с этим несоответствием, вы всегда можете написать list(...) или всегда использовать `:=`(...) в j.

В вашем примере это может означать изменение функции для возврата одного столбца вместо переноса в list(...). Для некоторых других идей и ссылок на виньетки, включенные в пакет, возможно см. Добавление столбцов списка к таблицам данных в R возвращает несовместимый вывод - функция или ошибка?

В качестве альтернативы, вы могли бы применить tag Править более эффективно с чем-то вроде «неравного соединения»:

mDT = data.table(
  yr_up  = c(2010, 2010, Inf, Inf), 
  sal_up = c(25000, Inf, 100000, Inf), 
  value  = c("okay", "cool", "okay", "cool")
)

dt[, cmt := mDT[.SD, on=.(yr_up > yr, sal_up > sal), mult="first"]$value]
0
ответ дан Frank 15 January 2019 в 17:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: