2013-05-19 17 views
57

Jaki jest poprawny sposób na usunięcie wielu kolumn z data.table? Obecnie używam poniższego kodu, ale otrzymałem nieoczekiwane zachowanie, gdy przypadkowo powtórzyłem jedną z nazw kolumn. Nie byłem pewien, czy to był błąd, czy też nie powinienem usuwać kolumn w ten sposób.Usuń wiele kolumn z data.table

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

Powyższe działa dobrze, ale

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

+1. Interesujące znalezisko. Jeśli usuniesz dwa "y", pozostanie "x". A jeśli usuniesz dwa "z", to zawiesza się! – Frank

+4

Na razie możesz zawinąć LHS z przydziału ': =' w wywołaniu 'unique()' (tj. Użyj 'DT [, unique (c (" x "," x ")): = NULL]') być dodatkowym defensywnym. Ponieważ wydaje się, że jest to bug ** data.table **, domyślam się, że będziesz musiał to zrobić, dopóki Matthew Dowle nie przeniesie tego połączenia do 'unique()' (lub czegoś podobnego) wewnątrz '[ .data.table() ' –

+0

Dobry pomysł na wyjątkowy. Dzięki. –

Odpowiedz

32

To wygląda jak stały, powtarzalny błąd. Został zgłoszony jako Bug #2791.

Wygląda na to, że powtarzanie kolumny powoduje usunięcie kolejnych kolumn.
Jeśli żadna kolumna nie zostanie, to R ulega awarii.


UPDATE: Teraz ustalona v1.8.11. Od NEWS:

Przypisanie tej samej kolumny dwa razy w tym samym zapytaniu jest teraz w pewnych okolicznościach błędem, a nie awarią; np. DT [, c ("B", "B"): = NULL] (dwa razy usuń przez odniesienie tę samą kolumnę). Podziękowania dla Ricardo (#2751) i matt_k (#2791) za zgłoszenie. Dodano testy.

+0

Chciałbym dodać, że składnia kropkowa (która jest używana jako skrót do listy w niektórych opcjach DT) nie zadziała tutaj, tj. "DT [,. (" X "," x "): = NULL]' zawiedzie. Wygląda na to, że musi to być wektor nazw kolumn jako łańcuchów. – Bar

11

Ta odpowiedź została udzielona, ​​ale należy to traktować jako notatkę dodatkową.

wolę następującą składnię spadać wiele kolumn

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

ponieważ dopasowuje jedno do dodania wielu kolumn (zmienne)

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

to również sprawdzić zduplikowanych nazw kolumn. Dlatego próba dwukrotnego upuszczenia x spowoduje wyświetlenie komunikatu o błędzie.