Удалите несколько столбцов из data.table

Каков правильный способ удаления нескольких столбцов из таблицы data.table? В настоящее время я использую код ниже, но получал неожиданное поведение, когда я случайно повторил одно из имен столбцов. Я не был уверен, что это ошибка, или если я не должен удалять столбцы таким образом.

library(data.table)
DT <- data.table(x = letters, y = letters, z = letters)
DT[ ,c("x","y") := NULL]
names(DT)
[1] "z"

Вышеописанное работает отлично, но

DT <- data.table(x = letters, y = letters, z = letters)
DT[ ,c("x","x") := NULL]
names(DT)
[1] "z"

Ответ 1

Это похоже на твердую, воспроизводимую ошибку. Он был зарегистрирован как Ошибка № 2791.

Похоже, что повторение столбца пытается удалить последующие столбцы.
Если столбцов не осталось, R сбой.


UPDATE: теперь исправлено в v1.8.11. Из NEWS:

Присвоение одного и того же столбца дважды в одном и том же запросе теперь является ошибкой, а не сбоем при некоторых обстоятельствах; например, DT [, c ( "B", "B" ): = NULL] (дважды удалить по ссылке один и тот же столбец). Спасибо Рикардо (# 2751) и matt_k (# 2791) за отчетность. Добавлены тесты.

Ответ 2

Этот Q был дан ответ, но рассматриваем это как примечание.

Я предпочитаю следующий синтаксис для удаления нескольких столбцов

DT[ ,`:=`(x = NULL, y = NULL)]

потому что он совпадает с тем, чтобы добавить несколько столбцов (переменных)

DT[ ,`:=`(x = letters, y = "Male")]

Это также проверяет наличие дублированных имен столбцов. Поэтому попытка сбросить x дважды вызовет сообщение об ошибке.