Видаліть кілька стовпців із data.table


76

Який правильний спосіб видалити з 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"

3
+1. Цікава знахідка. Якщо ви видалите два "y", у вас залишиться "x". І якщо ви видалите два "z", він вийде з ладу!
Френк

4
Наразі ви можете обернути LHS :=завдання, закликаючи unique()(тобто використовувати DT[ ,unique(c("x","x")) := NULL]), щоб бути додатковим захисним. Оскільки це здається помилкою data.table , я думаю, вам доведеться це робити лише до тих пір, поки Метью Даул не перемістить цей виклик unique()(або щось еквівалентне йому) всередину[.data.table()
Джошу О'Брайену

Хороша ідея про унікальне. Дякую.
matt_k

1
Привіт, хлопці, можливо, ви знаєте, чому цей код [R] у мене не працює? > myCols <- c ("Col1", "Col2") > DT [, myCols: = NULL] Припустимо, що DT містить обидва стовпці
MindaugasK

3
@MindaugasK Я знайшов це рішення - вам все одно потрібно обернути список стовпців як список, щоб він працював. Змініть його на, DT[, c(myCols):=NULL]і це повинно зробити трюк. Дивіться rdatatable.gitlab.io/data.table/articles/…
Вінс

Відповіді:


36

Це виглядає як суцільна відтворювана помилка. Він був поданий як помилка № 2791 .

Здається, повторюючи стовпець намагається видалити наступні стовпці.
Якщо стовпців не залишилось, то R аварійно завершує роботу.


ОНОВЛЕННЯ : Виправлено у версії 1.8.11. З НОВИН :

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


Я хотів би додати, що синтаксис крапок (який використовується як ярлик для списку в деяких операціях DT) тут не працюватиме, тобто DT[ , .("x","x") := NULL]не працюватиме. Здається, це повинен бути вектор імен стовпців як рядків.
Бар

19

На це запитання відповіли, але розцінюйте це як додаткову примітку.

Я вважаю за краще, щоб наступний синтаксис скидав кілька стовпців

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

оскільки він відповідає тому, щоб додати кілька стовпців (змінних)

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

Це також перевіряє наявність дубльованих імен стовпців. Отже, спроба скинути xдвічі видасть повідомлення про помилку.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.