Ответ @akrun дает вам правильную альтернативу. Если вы хотите знать, зачем вам это нужно, вот более подробное объяснение:
То, как работает операция подмножества data.table, в большинстве случаев выражение j
в dt[i, j, by]
без i
или by
оценивается во фрейме таблицы данных и возвращается как есть, независимо от того, имеет ли оно какое-либо отношение к данным. таблицу за скобками. В версиях до 1.9.8 ваш первый фрагмент кода: dt[,c(4, 5, 6)]
возвращает числовой вектор c(4, 5, 6)
, а не 4-й, 5-й и 6-й столбцы. Это изменилось в data.table v1.9.8 (выпущено в ноябре 2016 г.) (прокрутите вниз до v.1.9.8, потенциально критические изменения), потому что люди, что неудивительно, ожидали, что dt[,c(4, 5, 6)]
даст 4-й, 5-й и 6-й столбцы. Теперь, если выражение j является именами переменных или числами, with
автоматически устанавливается на FALSE
. Это фактически создает поведение, похожее на подмножество фрейма данных (не совсем такое же, но похожее).
Таким образом, ваш второй фрагмент кода (где dt[, a]
оценивается как a
, а не использует a
для подмножества столбцов) фактически используется по умолчанию, а первый — это особый случай.
Чтобы проиллюстрировать странное, но стандартное поведение здесь, попробуйте:
dt[, diag(5)]
# [,1] [,2] [,3] [,4] [,5]
# [1,] 1 0 0 0 0
# [2,] 0 1 0 0 0
# [3,] 0 0 1 0 0
# [4,] 0 0 0 1 0
# [5,] 0 0 0 0 1
Независимо от того, что у вас dt
, если это таблица данных, она будет оцениваться как матрица идентичности 5 * 5.
person
De Novo
schedule
12.03.2018
data.table
часто задаваемые вопросы: cran.r- project.org/web/packages/data.table/vignettes/ - person MichaelChirico   schedule 12.03.2018